Diff について (1)

Delicious
[日記]

Diff に興味を持ったので、Diff のことをボチボチ調べ始めました。

周辺情報 => 論文 => ソースコード、の順に読んでいくと思います。

今回は「An O(ND) Difference Algorithm and Its Variations」という論文にいろいろ略語が出てきたので、それを書きながら整頓したときのメモ。


メモ


- Difference : 違い
-- 複数のファイル間の差文をとるプログラム

- Diffをとることは以下のいずれかを求めるのと同義
1, LCS(Longest Common Subsequence)
 - LCSを見つけて、差分を求める
2, SES(Shortest Edit Script)
  - 「追加」と「削除」と「現状維持」のみを許可した場合に、文字列Aから文字列Bへ最も少ない編集回数(Shortest Edit Distance)で変換が行える処理組み合わせを求める

- ただし、LCSとSESの両アプローチの結果は一致しない。
-- 「aab」と「ab」の間で
--- LCSは後ろ側のabに決まる
--- SESは前のaを消しても、後ろのaを消してもじ編集距離。

- Levenshtein Distance(Edit Distance)
-- 文字列Aを文字列Bに変換するために、必要な文字の追加と削除の合計回数

- LCS
-- 文字列Aと文字列Bの最長共通部分列
--- 部分列と部分文字列はちがう
-- 両方の文字列に共通で出現する文字を出現順が崩れないように抽出
--- 抽出できる共通部分列のうち最長のものがLCS

- SES
-- 文字列Aから文字列Bへの変換を最小の編集回数でおこなうための手順
-- 要素の追加・削除の操

- Edit Graph
-- 文字列A・Bを行と列に配置した格子状の有向グラフ。
-- Aのx番目の文字A(x)と、B(y)が「A(x)=B(y)」になる任意の点(x, y)について、(x-1, y-1)から(x,y)へ斜め線を引く

-- SESとの関係
Edit Graphのたどり方SESへの作用意味コスト
y軸方向に1進むSESの追加BからAに無い要素を削除1
x軸方向に1進むSESの削除AからBに無い要素を削除1
斜め線上を1進むSESが共通一致する箇所を走査0

- SESの計算
-- Edit Graphのスタートからゴールまでの最短距離を求める問題
--- SED(Shortest Edit Distance : 最小編集距離)を持つSESを求める

- 最終的なSESのコスト = Levenshtein Distance

- 素朴に考えると2回のスキャンが必要。
-- 1, 一回すべての格子上の点で文字が一致するかを判定し、配列などに記録
-- 2, 先ほどの一致点の判定データを元に、(0,0)から(M, N)のSEDをもつSESをもとめる




次は「O(ND) Difference Algorithm」のメモを書きます。

参考文献


- E.W.MYERS, An O(ND) Difference Algorithm and Its Variations
- S.W.Maner, G.Myers, W.Miller, An O(NP) Sequence Comparison Algorithm
- 文書比較アルゴリズム
- diff(1)
- diff(2)
- diff(3)

関連リンク


- diff - Wikipedia
-- http://ja.wikipedia.org/wiki/Diff
diffプログラムはファイルの比較を行うためのコマンドで2つのファイル間の違いを出力できる。diffプログラムは行単位でテキストファイル間の差異を表示する。最近の実装ではバイナリファイルもサポートしている。


- diff のソースコード
-- diff.c - diffutils-2.7 - Code Search

関連商品


新The UNIX Super Text 上 改訂増補版

[Amazonで詳細を見る]






[2010-05-10]:追記。
論文のリンクを変更。ダウンロードしやすいものに置き換え。


関連するエントリ

[2010-05-09-1] Diff について (2)
[-] 1
投稿者:としのり  日時:23:59:59 | コメント | トラックバック |
blog comments powered by Disqus