※しろくろのへや:do_diffから移動してきました。 -- ぱんだ
文書比較アルゴリズムより...
文書比較を行う問題は、2つの文書A,Bの最長共通部分(LCS Longuest Common Subsequence)、または最小エディット距離(SED Shotest Edit Distance)を求める問題と等価である。
…だそうです。なんとなく速そうだったので、PukiWikiの差分表示ルーチンをO(NP)アルゴリズムで作ってみようと思った次第で。
http://www.cs.arizona.edu/people/gene
[1] E.W.Myers, "An O(ND) difference algorithm and its variations", Algorithmixa, 1 (1986), pp.251-266
[2] S.W.maner, "G.Myers, W.Miller, An O(NP) Sequence Comparison Algorith", August 1989
論文をがんばって読んだんですが、まだぼんやりとしか理解できていません。 :)
論文にはPascalのコードが書いてあったんで、そいつをパクろうと思ったんですが、具体的に追加/削除された行をどうやって算出するのかがよくわからなかったので、そのあたりを適当(≒かなりいい加減)にでっち上げてしまいました。
更新の衝突を自動的に何とかするような仕掛けを考えてみました。
l | r | 現在のページ | ポストしたページ | 処置 |
変更無し | 変更無し | 維持 | ||
- | 変更無し | 削除 | 削除 | |
- | 削除 | 変更無し | 削除 | |
- | - | 削除 | 削除 | 削除 |
+ | 該当行無し | 追加 | 追加 | |
+ | 追加 | 該当行無し | 追加 |
行の書き換えは、「一行削除+一行追加」とみなされます。
元の行
現在のページに書かれた行
ポストしたページに書かれた行
l | r | text |
- | - | 元の行 |
+ | 現在のページに書かれた行 | |
+ | ポストしたページに書かれた行 |
現在のページに書かれた行 ポストしたページに書かれた行
1 2 3 4
3 4 1 <-移動 2 <-移動
1 1のつづき <-追記 2 3 4
l | r | text |
- | 1 | |
+ | 1のつづき | |
- | 2 | |
3 | ||
4 | ||
+ | 1 | |
+ | 2 |
1のつづき ←生き別れ 3 4 1 2こういう場合は、'1のつづき'を適切な場所に手動で移動してください。 ;(
-- [[こじま]] SIZE(10){2003-01-13 (月) 05:50:00}
+ | + | - | - | ||
a | b | c | d | ||
e | b | a | b |
- | + | - | - | + | + | |
a | b | c | d | |||
e | b | a | b |