タグ

algorithmとProgrammingに関するtorutoのブックマーク (47)

  • diffの動作原理を知る~どのようにして差分を導き出すのか | gihyo.jp

    UNIXの基的なコマンドの1つであるdiff。 これに実装されているアルゴリズムは実に興味深い世界が広がっています。 稿では、筆者が開発した独自ライブラリ「dtl」をもとに「diffのしくみ」を解説します。 はじめに diffは2つのファイルやディレクトリの差分を取るのに使用するプログラムです。 ソフトウェア開発を行っている方であれば、SubversionやGitなどのバージョン管理システムを通して利用していることが多いかと思います。稿ではそのdiffの動作原理について解説します。 差分の計算の際に重要な3つの要素 差分を計算するというのは次の3つを計算することに帰結します。 編集距離 2つの要素列の違いを数値化したもの LCS(Longest Common Subsequence) 2つの要素列の最長共通部分列 SES(Shortest Edit Script) ある要素列を別の要

    diffの動作原理を知る~どのようにして差分を導き出すのか | gihyo.jp
  • 「最強最速アルゴリズマー養成講座」関連の最新 ニュース・レビュー・解説 記事 まとめ - ITmedia Keywords

    最強最速アルゴリズマー養成講座: そのアルゴリズム、貪欲につき――貪欲法のススメ アルゴリズムの世界において、欲張りであることはときに有利に働くことがあります。今回は、貪欲法と呼ばれるアルゴリズムを紹介しながら、ハードな問題に挑戦してみましょう。このアルゴリズムが使えるかどうかの見極めができるようになれば、あなたの論理的思考力はかなりのレベルなのです。(2010/9/4) 最強最速アルゴリズマー養成講座: 病みつきになる「動的計画法」、その深淵に迫る 数回にわたって動的計画法・メモ化再帰について解説してきましたが、今回は実践編として、ナップサック問題への挑戦を足がかりに、その長所と短所の紹介、理解度チェックシートなどを用意しました。特に、動的計画法について深く掘り下げ、皆さんを動的計画法マスターの道にご案内します。(2010/5/15) 最強最速アルゴリズマー養成講座: アルゴリズマーの登

  • 細かすぎて伝わりにくいTopCoderのコーディングスキル向上マジック

    細かすぎて伝わりにくいTopCoderのコーディングスキル向上マジック:最強最速アルゴリズマー養成講座(1/3 ページ) 競技プログラミングはレベルの高い人たちの集まり――そんな考えを持っている初心者の方、TopCoderはあなたのコーディングスキルを爆発的に高める魔法のような場です。今回は、初心者にこそお勧めしたいTopCoderの魅力について考えます。 教育的な観点から見るTopCoder 今回からTopCoderに関する実践的アルゴリズムを解説していく予定でしたが、序盤のうちに触れておきたいことがありましたので、今回の枕は“教育的視点から見るTopCoder”というテーマで少し書こうかと思います。 まず、最初に宣言しておきたいことは、この連載は初心者向きである、ということです。「どう考えても上級者向けだろう」という意見はたくさんの方から寄せられていますが、筆者は、まだプログラミングレ

    細かすぎて伝わりにくいTopCoderのコーディングスキル向上マジック
  • ブルームフィルタ - Wikipedia

    この項目では、確率的データ構造について説明しています。画像にぼかし効果を付加する画像フィルタについては「川瀬のブルームフィルター」をご覧ください。 ブルームフィルタ(英語: Bloom filter)は、1970年に Burton H. Bloom が考案した空間効率の良い確率的データ構造であり、あるデータが集合の要素である(集合に含まれている)かどうかの判定に使われる。ただし判定は正確ではなくて、含まれていないのに含まれていると誤って判定すること偽陽性(false positive)の可能性がある。しかし含まれているものを含まれていないと誤判定すること偽陰性(false negative)はない。なお集合に要素を追加することはできるが、集合から要素を削除することはできない(ただし、拡張をした counting filter であれば削除もできる)。集合に要素を追加していくにつれて偽陽性の

    ブルームフィルタ - Wikipedia
  • LSH (Locality Sensitive Hashing) を用いた類似インスタンスペアの抽出 - mixi engineer blog

    GW 中の長距離移動のために体調が優れない takahi-i です. 今回は巨大なデータをマイニングする一つの技術として LSH (Localtiy Sensitive Hashing) を紹介させていただきます. LSH とは LSH は大量なデータから類似度が高いインスタンスのペアを高速に抽出してくれるアルゴリズムです. ここでインスタンスはデータ集合の一つの要素を表します. たとえば扱うデータが E-コマースサイトの購買ログであれば, インスタンスは各ユーザですし, 画像データ集合であれば, インスタンスは個々の画像データです. LSH の詳しい解説については以下のサイトがあります. Wikipedia のエントリ LSH に関する論文がまとめられているページ 稿ではE-コマースサイトの購買履歴データを基に LSH の機能について述べてゆきます. 以下のような E-コマースサイトの

    LSH (Locality Sensitive Hashing) を用いた類似インスタンスペアの抽出 - mixi engineer blog
  • 修正離散コサイン変換 - Wikipedia

    この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方) 出典検索?: "修正離散コサイン変換" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2023年6月) 修正離散コサイン変換(しゅうせいりさんコサインへんかん)または変形離散コサイン変換 (modified discrete cosine transform; MDCT) とは、離散時間信号のサンプル値の系列を時間領域から周波数領域へ変換する離散時間信号処理技法の一種である。 主にMP3やAAC、Vorbisといった音声圧縮などで用いられている。 逆変換は逆修正離散コサイン変換 (IMDCT) である。 MDCTは、窓を半分ずつ重複させながら変換を行

  • 特徴点検出器を作ってライブラリに追加した - デー

    前々からアニメ顔類似検索のbag of featuresで使っている特徴点の決め方がイラストにあまり合っていない気がしていたけど、実装がすごく面倒くさそうだったのでやらなかった。しかし、最近SURFに特許があることが発覚して、SURFを使っている意味は特にないなーと思ったので、満足のいくものをつくろう思ったのであった。(ただ特許は気にせずにやる) ということで、こんなのができた(クリックで拡大)。 結構速いし、スケールの変化、回転、ある程度のゆがみには大体対応できている。対応点の決定は、点の特徴ベクトルが一番近い点と二番目に近い点を取って、ふたつの特徴ベクトルの距離の差を確信度として、確信度が高いもののみマッチングしたことにして表示している。 SIFTやSURFに比べると点多すぎだろ(なぜ渦巻きに…)と思うかもしれないけど、これは僕なりにイラストの特性とかbag of featuresで使

    特徴点検出器を作ってライブラリに追加した - デー
  • 3分探索 - ICPC突破専用ザク

    凸関数の極値を求める方法を知りたくなってググってみたところid:nodchipさんのエントリがヒットした. 以下,個人的なまとめ. 実数探索三種類解説 - nodchipの日記 http://d.hatena.ne.jp/nodchip/20090303/1236058357 単調関数の零点を求めるのには2分探索が使われるけど,凸関数の極値を求めるのには3分探索が使われるらしい. 三分探索は凸関数の極値を求めるために使うアルゴリズムです。このアルゴリズムは関数が微分不可能な場合にも使えます。やり方は探索領域を三分割し、真ん中二の境界のうちどちらの値が大きいかを調べ、それとは逆の方の境界を新たな探索領域の端にするというものです。一回のイテレーションで関数の計算を2回行い、探索領域が2/3になります。 3分探索がうまくいく理由は以下のとおり. f : [a,b]→R : 上に凸な関数とし,区

    3分探索 - ICPC突破専用ザク
  • min_heapを用いた上位r個の要素の抽出 - tsubosakaの日記

    MG勉強会の発表があるため4.6ランキング検索の部分を読むついでに、最後のサブセクションの上位r個の要素を取り出す部分について実装してみた。 情報検索において、N個の候補集合から上位r個の要素を取り出すことが多い。 値が配列に格納されているとするとこれを実現するためのコードはもっとも単純に行うと以下のようになる //長さlenの配列arrayの中でトップr個の値をresultに挿入する void sort_method(int * array , int len, int r , vector<int> & result){ sort(array , array + len); copy(array + len - r , array + len , back_inserter(result)); } しかし、Nが大きいとき、MGの例だとN=100万のときにsortの処理にはおおよそ100

    min_heapを用いた上位r個の要素の抽出 - tsubosakaの日記
  • アルゴリズムの紹介

     ここでは、プログラムなどでよく使用されるアルゴリズムについて紹介したいと思います。 元々は、自分の頭の中を整理することを目的にこのコーナーを開設してみたのですが、最近は継続させることを目的に新しいネタを探すようになってきました。まだまだ面白いテーマがいろいろと残っているので、気力の続く限りは更新していきたいと思います。 今までに紹介したテーマに関しても、新しい内容や変更したい箇所などがたくさんあるため、新規テーマと同時進行で修正作業も行なっています。 アルゴリズムのコーナーで紹介してきたサンプル・プログラムをいくつか公開しています。「ライン・ルーチン」「円弧描画」「ペイント・ルーチン」「グラフィック・パターンの処理」「多角形の塗りつぶし」を一つにまとめた GraphicLibrary と、「確率・統計」より「一般化線形モデル」までを一つにまとめた Statistics を現在は用意して

  • ぜひ押さえておきたいコンピューターサイエンスの教科書

    僕はバイオインフォマティクスという生物と情報の融合分野で研究を行っています。東大の理学部情報科学科にいた頃は同僚のマニアックな知識に驚かされたものですが、そのような計算機専門の世界から一歩外に出ると、それが非常に希有な環境だったことに気が付きました。外の世界では、メモリとディスクの違いから、オートマトン、計算量の概念など、コンピューターサイエンスの基礎知識はあまり知られていませんでした。コンピューターサイエンスを学び始めたばかりの生物系の人と話をしているうちに、僕が学部時代に受けた教育のうち、彼らに欠けている知識についても具体的にわかるようになってきました。 バイオインフォマティクスに限らず、今後コンピュータを専門としていない人がコンピューターサイエンスについて学ぶ機会はますます多くなると思われます。そこで、これからコンピューターサイエンスを学ぼうとする人の手助けとなるように、基礎となる参

  • レーベンシュタイン距離 - Wikipedia

    レーベンシュタイン距離(レーベンシュタインきょり、英: Levenshtein distance)は、二つの文字列がどの程度異なっているかを示す距離の一種である。編集距離(へんしゅうきょり、英: edit distance)とも呼ばれる。具体的には、1文字の挿入・削除・置換によって、一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数として定義される[1]。名称は、1965年にこれを考案したロシアの学者ウラジーミル・レーベンシュタイン (露: Влади́мир Левенште́йн) にちなむ。 レーベンシュタイン距離は、同じ文字数の単語に対する置換編集に使われているハミング距離の一般化であると見なすことが可能である。レーベンシュタイン距離の更なる一般化として、例えば一回の操作で二文字を変換する等の方法が考えられる。 実際的な距離の求め方を例示すれば、「kitten」を「s

  • コサイン距離ベースのLSHをRubyで - &lt;s&gt;gnarl,&lt;/s&gt;技術メモ”’&lt;marquee&gt;&lt;textarea&gt;¥

    参考文献:Web+DB press vol.49 レコメンド特集のPart3など。 アルゴリズムの概要 詳細(特に数学的な)はぐぐれ。 モチベーションとしては、高次元における近傍点探索を高速で行いたい。まじめにやるとどう工夫しても計算量がすごいことになるので、近似で。 どうするかというと、「距離が近いと同じような値になるハッシュ関数」を使う。あるベクトルの近傍を求めたい場合、そのベクトルのハッシュと同じ(もしくは近い)値のハッシュを持つベクトルをテーブルから引いてきて返す。計算量がどうなるかはややこしいけど、とりあえず全部探すよりは速い。 で、どういう関数をハッシュとするのか。これは距離の定義によって異なる。ハミング距離、コサイン距離、ユークリッド距離などにはそういった関数の存在が知られている。 コサイン距離の場合、ランダムなベクトルをいくつか用意して、入力されたベクトルがそれらと似ている

    コサイン距離ベースのLSHをRubyで - &lt;s&gt;gnarl,&lt;/s&gt;技術メモ”’&lt;marquee&gt;&lt;textarea&gt;¥
  • 自然言語処理は Python がいちばん - 武蔵野日記

    現在大学1年生の人で3年後には NAIST に (というか松研に) 来たいという人から「どんなプログラミング言語やっておくといいですか」と質問されたりするのだが、なかなか答えるのは難しい。自分は PerlPython がメインでときどき C++/C# を使ったりするのだが、どれが一番いいかはなんとも言えないので、自然言語処理以外に転向する可能性も考えると、C とか C++ とか Java とか(授業でそちらをやるのであれば)を最初の武器に選んだ方がいいのでは、と思ってはいる。 そんなこんなで最近 Hal Daume III (機械学習を用いた自然言語処理では非常に有名な人) のブログで Language of Choice というタイムリーなエントリーが出ていたので、紹介すると、「それなりに大きな自然言語処理のプロジェクトでどのプログラミング言語を使うのか」というアンケート結果が出

    自然言語処理は Python がいちばん - 武蔵野日記
  • プログラムの動かし方の本 - きしだのはてな

    Seasarカンファレンスで、基礎としてプログラムの動かし方であげた。と、それに加えて挙げれなかった。 ちなみにSeasarカンファレンスでの内容はid:tanamonがまとめてくれてる。というか、手書きスライドの書き起こしをしてもらってます。 「手書きで書く→ソーシャルに清書してもらう」という、新しいプレゼン手法が生まれました! 差のつく勉強法200のメモ - tanamonの日記 プレゼンや以前のエントリでは、プログラムというのは計算論と意味論に分かれると書いたけど、プログラム意味論という分野と混同してへんな議論になっちゃうので、「プログラムをどう動かすか」と「プログラムをどう書くか」に分かれるとします。命令的な側面と宣言的な側面だと言ってもいいかもしれない。今回は命令的な側面について。 まずは、基礎となる数学、離散数学について。 やさしく学べる離散数学 作者: 石村園子出版社/メ

    プログラムの動かし方の本 - きしだのはてな
  • プログラミングのための確率統計(仮)

    数学のプロをめざさない方に向けた確率・統計の解説. ちびちび執筆中. お気づきの点は 「なんでも」 までお知らせください. ダウンロード 原稿 PDF (未完成版のため誤りや抜けがあります) 冒頭 …… とりあえず雰囲気を見るにはこちら 全体 特徴 「確率は測度だ」という格的な見方を, アマチュア向けにかみくだいて解説しています (1章) そのおかげで, 条件つき確率だの期待値の性質だのにクリアなイメージが与えられます (2章, 3章) 「引きのばせば密度は薄まる」といった直感的な図解を多用し, さらに「何がしたくて」という意図の説明も重視しました (4章) 応用上必要なのに入門書では省かれがちな多変数の議論も, しっかりと (5章) リンク プログラミングのための線形代数 (前著の非公式サポートページ) ためし書き (稿の原型) 更新履歴 [2008-08-10] 演習 5.20 の

  • スペル修正プログラムはどう書くか

    Peter Norvig / 青木靖 訳 先週、2人の友人(ディーンとビル)がそれぞれ別個にGoogleが極めて早く正確にスペル修正できるのには驚くばかりだと私に言った。たとえば speling のような語でGoogleを検索すると、0.1秒くらいで答えが返ってきて、もしかして: spelling じゃないかと言ってくる(YahooMicrosoftのものにも同様の機能がある)。ディーンとビルが高い実績を持ったエンジニアであり数学者であることを思えば、スペル修正のような統計的言語処理についてもっと知っていて良さそうなものなのにと私は驚いた。しかし彼らは知らなかった。よく考えてみれば、 別に彼らが知っているべき理由はないのだった。 間違っていたのは彼らの知識ではなく、私の仮定の方だ。 このことについてちゃんとした説明を書いておけば、彼らばかりでなく多くの人に有益かもしれない。Google

  • mloss | All entries

    Alpenglow 1.0.6 About: A recommender systems research framework aimed at modeling non-stationary environments. Changes: Initial Announcement on mloss.org.

  • ソートアルゴリズムの可聴化 - ならば

    Sorting Algorithm Animationsなどのサイトでは、ソートアルゴリズムの可視化の例を見ることができる。今回は可視化に倣ってソートアルゴリズムを可聴化した。聴覚化すると、情報を分かりやすく提示するという方向から外れるけど。 ソートする対象は50から90までの整数をランダムに並べた列。可聴化の方法は、整数をMIDIノート番号とみなして、ソートアルゴリズムが各時点でポイントしている位置にある、MIDIノート番号の音高の音を鳴らすようにした。ChucKのプログラムはいつもより長くなったから最後に載せる。 録音したもの。元の整数列は全部同じで、サイズ(整数の数)は30。 バブルソート 選択ソート 挿入ソート シェルソート クイックソート マージソート ヒープソート 拡張としては、 より詳細に情報を提示する方向(例:整数同士の位置の交換時に音色を変える) サウンドアートな方向(例

    ソートアルゴリズムの可聴化 - ならば
  • はてなブログ | 無料ブログを作成しよう

    読書感想】論理的思考とは何か ☆☆☆☆ 論理的思考とは何か (岩波新書 新赤版 2036)作者:渡邉 雅子岩波書店Amazon Kindle版もあります。論理的思考とは何か (岩波新書)作者:渡邉 雅子岩波書店Amazon 論理的思考法は世界共通ではない。思考する目的をまず明確にしてその目的に合った思考法を選ぶ技術が要る。…

    はてなブログ | 無料ブログを作成しよう