文書比較(diff)アルゴリズム 前のドキュメント 次のドキュメント ViViの文書比較(diff)機能で使用しているアルゴリズムについて解説する。 これらのアルゴリズムは Myers 氏らの論文によるもので、氏は筆者のためにわざわざ論文をWebサイトで入手可能な形式にしてくださった。この場を借りてお礼申し上げる。 オリジナル論文は以下のWebサイトから入手可能である。 http://www.cs.arizona.edu/people/gene [1] E.W.Myers, "An O(ND) Difference Algorithm and Its Variations", Algorithmica, 1 (1986), pp.251-266 [2] S. Wu, U. Manber, G. Myers and W. Miller, "An O(NP) Sequence Comparis
そんなわけでO(NP)のお話とか。 まず、処理を最適化するためにO(ND)の無駄を考えてみる。 O(ND)では編集回数Dを0…nと変化させて順次処理を行うわけだけど、仮に集合A(0…M)とB(0…N)の間で、M!=Nの関係が有る場合、D<|M-N|の間は決して終端にたどり着かない期間の計算となる。 また、編集回数Dの時に、零距離直線kを-D…0…Dまで計算するが、この際も実際には結構無駄な計算を行っている。 というのも、編集回数Dで終点にたどり着ける場合、実際に経路として使用されるkの範囲は-D…0…Dと一致しない。 集合Aと集合Bの関係をN>=Mと仮定して、Δ=N-Mとした場合、この未知の集合において最も少ない編集回数はΔとなるが、その場合のkの範囲は0…Δとなる(上図の緑色の範囲)。 以降Dが2増える毎(移動距離1の往復分)に-1…Δ+1、-2…Δ+2とkの範囲が広がっていくこ
diff続き。 今回はO(ND)アルゴリズムと一般的に呼ばれている方法のまとめ。 O(Nなんちゃら)とか表記する場合、本当は処理時間の指標の筈で、元々O(ND)もこのアルゴリズムにはO(ND)掛かりますよってダケの筈なんだけどなぁ・・・。 何処を覗いてもMyers氏のアルゴリズムをO(ND)アルゴリズムと呼ぶ不思議。 diff(1)と同様に 集合 A(0…M) = { a b d e f a b c e d } 集合 B(0…N) = { d a b a b c b c b a e d } のdiffを取る事を考える。 (エディットグラフは前回参照で) エディットグラフ上の最短距離を考えるにあたり、如何に効率よく斜線部分を通るかを考える(最短距離=最も効率よく斜線部分を通過した経路)。 ここで、斜線斜線と呼ぶのも、原文diagonal直訳の対角線もちょっとアレなので、あえて
仕事でdiffとる必要があって、とりあえず実装後に色々勉強して理解できたので、忘れないうちにどこかに文章化しておくテスト。 って、ここかよ<文章化 (いや、ネット上に日本語で細かく解説してくれてるサイトが無かったので・・・) 取り合えず、予定としては diff(1) → 基本の考え方 diff(2) → アルゴリズム1:O(ND)アルゴリズム diff(3) → アルゴリズム2:O(NP)アルゴリズム の予定で。 ・・・まぁ、全部書ければいいな・・・と(遠い目) 集合 A(0…M) = { a b d e f a b c e d } 集合 B(0…N) = { d a b a b c b c b a e d } のdiffを取る事を考える。 diffの考え方の基本は、最も共通部分が長くなる組み合わせ(以降LCS = LargestCommonSubsequence)を見つ
最近、C++でdiffを書いているせいか、バージョン管理システムで使われているdiffのパフォーマンスが気になったので、調べてみた。バージョン管理システムにおいてdiffはかなり重要である。というのも、diffもしくはそれに相当する処理は単に差分を表示する際だけでなく、updateやmerge時の差分適用など、至るところで行われるので、diffが遅いとバージョン管理システムにおけるありとあらゆる動作が遅くなってしまうからだ。 測定に使用したバージョン管理システム 測定に使用したバージョン管理システムは以下の通り。 Subversion-1.5.2 Monotone-0.41 Git-1.6.0.1 Mercurial-1.0.2 ちなみに上記のソフトを選択した理由は単に自分が普段から検証も含めて使用しているというだけです。 準備 まず、以下のような2種類のファイルの組合せを用意する。 Ty
ミートソーススパゲティを作るときは、ミートソースから作るのが信条のbokkoです。それはさておき、今日はdiffのお話です。 diff diffは指定した2つのファイルの差分を求めるコマンド、もしくはその差分そのものを指します。普段から何気なく使用しているコマンドですが、その中で使われているアルゴリズムは結構難しいです。 差分を計算するということ 差分を計算するというのは以下の3つを求めることに帰結します。 ・Levenshtein Distance(Edit Distance) ・LCS(Longest Common Subsequence) ・SES(Shortest Edit Script) 上から順に1つずつ説明していきます。 Levenshtein Distance Levenshtein Distanceは2つのシーケンスの違いを数値化したもので編集距離とも言います。これは後述
はじめに Maven2でテストフェーズ(test phase)を実行するといろいろなおまけが付いてきます。今回はこのテストフェーズについて調べてみました。 テストフェーズの実行方法 テストフェーズは、次の5通りの方法で実行することができます。 testフェーズを実行する maven-surefire-test-pluginを実行する maven-surefire-report-pluginを実行する maven-surefire-test-pluginをpom.xmlのbuildに組み込む maven-surefire-report-pluginをpom.xmlのreportingに組み込む 以下、それぞれの方法についてみていきます。 testフェーズを実行する テストフェーズは以下のコマンドで明示的に呼び出すことができます。 mvn test出力イメージはこんな感じです。 [INFO]
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く