SlideShare a Scribd company logo
DIFFの真髄	
fuku68	
1
はじめに	
¨  diff
¤  diff(ディフ)とはファイルの比較を行うためのコマンド
で2つのファイル間の違いを出力できるプログラム。
diffプログラムは行単位でテキストファイル間の差異
を表示する。	
2
diffの要素	
¨  編集距離
¤  2つの要素列の差異を数値化したもの
¨  LCS(Longest Common Subsequence)
¤  2つの要素列の最長共通部分列
¨  SES(Shortest Edit Script)
¤  ある要素列を別の要素列に変換するための最短手
順	
参考: http://gihyo.jp/dev/column/01/prog/2011/diff_sd200906	
3
LCS(Longest Common Subsequence)	
¨  最長共通部分列問題
¤  与えられた 2 つの列 X = ⟨x1,x2,...,xm⟩と
Y =⟨y1,y2,...,yn⟩の最長共通部分列を求める問題 	
¨  例)
¤  X = <A, B, C, B, D, A, B>
¤  Y = <B, D, C, A, B, A>
¤  LCS = <B, C, B, A>
¤  LCSは1つとは限らない!
n  <B, C A, B>もLCSの解
n  LCSが変わるとSESも変わる	
4
LCSの例	
5
¨  ABCBDABとBDCABA	
A	 B	 C	 B	 D	 A	 B	
B	 D	 C	 A	 B	 A	
LCS	 B	 C	 B	 A
SES(Shortest Edit Script)	
6
¨  要素列に対しての操作を行い、別の要素列にす
るための一連の操作	
状態遷移	 操作	
<A, B, C, B, D, A, B> Xの状態
<B, C, B, D, A, B> Aを削除
<B, D, C, B, D, A, B> Dを追加
<B, D, C, A, B, D, A, B> Aを追加
<B, D, C, A, B, A, B> Dを削除
<B, D, C, A, B, A> Bを削除(Yと一致)
編集距離	
7
¨  SESにおける要素の「追加」と「削除」の合計	
状態遷移	 操作	 編集距離	
<A, B, C, B, D, A, B> Xの状態
<B, C, B, D, A, B> Aを削除 +1
<B, D, C, B, D, A, B> Dを追加 +1
<B, D, C, A, B, D, A, B> Aを追加 +1
<B, D, C, A, B, A, B> Dを削除 +1
<B, D, C, A, B, A> Bを削除(Yと一致) +1
diffを求めるには…	
8
¨  LCSがわかればSES,編集距離は導い出される
¤  問題としては等価
¨  単純に考えると…
¤  Xから共通部分列を選んで、その共通部分列がYの
共通部分列になり得るのかを確認する。
¤  上記の方法であると計算量が多い
¤  効率の良いアルゴリズムは…
動的計画法(Dynamic Programming)	
9
¨  対象となる問題を複数の部分問題に分割し、部分
問題の計算結果を記録しながら解いていく手法
¨  DPの名称で呼ばれ、プログラムコンテストにおい
ても必須の分野
¤  ナップサック問題
¤  最短経路問題
LCSをDPで解く	
10
¨  LCS の部分構造最適性
1.  X[m] =Y[n] ならばZ[k] =X[m] =Y[n] であり,Zk−1 はXm−1 とYn−1 のLCSであ
る.
2.  X[m] != Y[n]のとき,Z[k] !=X[m] ならばZはXm−1 とY のLCSである.
3.  X[m] != Y[n]のとき,Z[k] !=Y[n]ならばZはXとYn−1 のLCSである. 	
¨  再帰的な解
¤  c[i,j]=
n  0 (i = 0 ま た は j = 0 の と き )
n  c[i−1,j−1]+1 (i,j>0かつxi =yj のとき)
n  max(c[i,j − 1],c[i − 1,j]) (i,j > 0 かつ xi = yj のとき)
DPでのプログラム1(python)	
11
def calc_lcs(a, b):
    n = len(a)
    m = len(b)
   
    matrix = []
    matrix.append ([0] * (m + 1))
    for i in range(n):
        matrix.append([0] * (m + 1))
        for j in range(m):
            if a[i] == b[j]:
                matrix[i + 1][j + 1] = matrix[i][j] + 1
            else:
                matrix[i + 1][j + 1]  = max(matrix[i][j + 1], matrix[i + 1][j] )
               
    # LCSの長さを算出	
    print("LCS length = " +  str(matrix[n][m]))
図解	
12
0	 0	 0	 0	 0	 0	 0	
0	 0	 0	 0	 1	 1	 1	
0	 1	 1	 1	 1	 2	 2	
0	 1	 1	 2	 2	 2	 2	
0	 1	 1	 2	 2	 3	 3	
0	 1	 2	 2	 2	 3	 3	
0	 1	 2	 2	 3	 3	 4	
0	 1	 2	 2	 3	 4	 4	
A
B
C
B
D
A
B
B D C A B A
i	
j	
¨  X = <A,B,C,B,D,A,B>
¨  Y = <B,D,C,A,B,A>
DPでのプログラム2(python)	
13
## LCSをDP法で求める。 	
def lcs(a, b): 	
	
# . . . 先ほどのコード	
# LCSの長さを算出	
print("LCS length = " + str(matrix[n][m]))	
	
lcs = []	
i = n; j = m	
while matrix[i][j] > 0:	
while i != 0 and matrix[i][j] == matrix[i - 1][j]:	
i = i – 1	
while j != 0 and matrix[i][j] == matrix[i][j - 1]:	
j = j – 1	
lcs.insert(0, a[i -1])	
i = i -1	
j = j -1	
# LCS	
print('LCS = ' + ''.join(lcs))
図解	
14
¨  X = <A,B,C,B,D,A,B>
¨  Y = <B,D,C,A,B,A>
¨  LCSの最大長 = 4
¨  表を辿れば
LCSが算出できる
¤  LCS = <B,C,B,A>	
0	 0	 0	 0	 0	 0	 0	
0	 0	 0	 0	 1	 1	 1	
0	 1	 1	 1	 1	 2	 2	
0	 1	 1	 2	 2	 2	 2	
0	 1	 1	 2	 2	 3	 3	
0	 1	 2	 2	 2	 3	 3	
0	 1	 2	 2	 3	 3	 4	
0	 1	 2	 2	 3	 4	 4	
A
B
C
B
D
A
B
B D C A B A
i	
j
DPでのプログラム2(python)	
15
def calc_lcs2(a, b):
n = len(a)
m = len(b)
row = [0] * (m + 1)
for i in range(n):
prev_len = 0
tmp = 0
for j in range(m):
tmp = row[j + 1]
if a[i] == b[j]:
row[j + 1] = prev_len + 1
else:
row[j + 1] = max(row[j], row[j + 1] )
prev_len = tmp
# LCSの長さを算出	
print("LCS length = " + str(row[m]))
LCSの長さだけ
であればメモリを節約
Hunt-Mcllroyのアルゴリズム	16
Hunt-Mcllroyのアルゴリズム	
17
¨  k-candidatesを考える
¤  X = <A, B, C, B, D, A, B>
¤  Y = <B, D, C, A, B, A>
A	 B	 C	 B	 D	 A	 B	
A	
B	
A	
C	
D	
B
k-candidates	
18
0	 1	 2	 2	 3	 3	 4	 4	
0	 1	 2	 2	 3	 3	 3	 4	
0	 1	 1	 2	 2	 2	 3	 3	
0	 0	 1	 2	 2	 2	 2	 2	
0	 0	 1	 1	 1	 2	 2	 2	
0	 0	 1	 1	 1	 1	 1	 1	
0	 0	 0	 0	 0	 0	 0	 0	
B
B
C
D
A
BDBCBA A
A
A	 B	 C	 B	 D	 A	 B	
A	
B	
A	
C	
D	
B	
¨  Ai = Bj
¨  Pij > max(Pi−1, j , Pi, j−1 )
k-candidatesを繋げる	
19
0	 1	 2	 2	 3	 3	 4	 4	
0	 1	 2	 2	 3	 3	 3	 4	
0	 1	 1	 2	 2	 2	 3	 3	
0	 0	 1	 2	 2	 2	 2	 2	
0	 0	 1	 1	 1	 2	 2	 2	
0	 0	 1	 1	 1	 1	 1	 1	
0	 0	 0	 0	 0	 0	 0	 0	
B
B
C
D
A
BDBCBA A
A
A	 B	 C	 B	 D	 A	 B	
A	
B	
A	
C	
D	
B	
¨  k-candidatesの左下にあるCandidateから最長のも
のを接続する。
¨  実装によって実際に接続されるものが異なる
実装コード	
20
¨  diff-lcs
¤  Rubyのdiffを求めるためのGem
¤  Hunt-Mcllroyのアルゴリズムを用いて実装
¤  片方をまずハッシュ化する
n  例) ABCBDAB
n  {' A' : [0, 5],' B' : [1, 3, 6],' C' : [2],' D' : [4]}
¨  https://github.com/halostatue/diff-lcs/blob/
master/lib/diff/lcs/internals.rb#L41
実践	
21
diff-lcsに触れる	
22
require 'diff/lcs'
seq1 = %w(a b c e h j l m n p)
seq2 = %w(b c d e f j k l m r s t)
lcs = Diff::LCS.LCS(seq1, seq2)
diffs = Diff::LCS.diff(seq1, seq2)
sdiff = Diff::LCS.sdiff(seq1, seq2)
seq = Diff::LCS.traverse_sequences(seq1, seq2, callback_obj)
bal = Diff::LCS.traverse_balanced(seq1, seq2, callback_obj)
seq2 == Diff::LCS.patch!(seq1, diffs)
seq1 == Diff::LCS.unpatch!(seq2, diffs)
seq2 == Diff::LCS.patch!(seq1, sdiff)
seq1 == Diff::LCS.unpatch!(seq2, sdiff)
その他のアルゴリズム	23
O(ND)アルゴリズム	
24
¨  E.W.Myersの手法
¨  edit graphを用いた最短経路問題として捉える
¨  すべての経路を探索せずにコスト=nの時の条件下の制約で検索
範囲を狭くする
A
B
C
B
D
A
B
B D C A B A(0, 0)	
各経路のコスト	
0	
1	
1
O(NP) アルゴリズム	
25
¨  Wuの手法
¨  Myersの手法nに対して文字数の差(delta)を考慮して、
さらに検索の効率をあげる
参考文献	
¨  wikipedia
¤  https://ja.wikipedia.org/wiki/Diff
¨  diffの動作原理を知る~どのようにして差分を導き出すのか
¤  http://gihyo.jp/dev/column/01/prog/2011/diff_sd200906
¨  アルゴリズムイントロダクション 第3版 総合版 (世界標準MIT教科書)
¤  https://www.amazon.co.jp/アルゴリズムイントロダクション-第3版-総合版-世界標
準MIT教科書-コルメン/dp/476490408X
¨  Hunt, James W.; McIlroy, M. Douglas (June 1976). "An Algorithm for
Differential File Comparison”
¤  http://www.cs.dartmouth.edu/~doug/diff.pdf
¨  Diff Algorithm
¤  http://constellation.hatenablog.com/entry/20091021/1256112978	
26

More Related Content

What's hot

RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッションarctic_tern265
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
as-2. メモリと CPU
as-2. メモリと CPUas-2. メモリと CPU
as-2. メモリと CPU
kunihikokaneko1
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
眞樹 冨澤
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
眞樹 冨澤
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHCKei Hibino
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Katsutoshi Makino
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 
SICP
SICPSICP
SICP
S W
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
MITSUNARI Shigeo
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
swkagami
 
DP特集
DP特集DP特集
DP特集
Dai Hamada
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Etsuji Nakai
 
SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来
Hidekazu Oiwa
 

What's hot (20)

RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッション
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
as-2. メモリと CPU
as-2. メモリと CPUas-2. メモリと CPU
as-2. メモリと CPU
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
 
llvm入門
llvm入門llvm入門
llvm入門
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 
SICP
SICPSICP
SICP
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
 
DP特集
DP特集DP特集
DP特集
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料
 
SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来
 

Similar to diffの真髄

KETpic できれいな図を書こう
KETpic できれいな図を書こうKETpic できれいな図を書こう
KETpic できれいな図を書こう
Yoshitomo Akimoto
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
Rを用いたGIS
Rを用いたGISRを用いたGIS
Rを用いたGIS
Mizutani Takayuki
 
データとは何か
データとは何かデータとは何か
データとは何か
Kenta Suzuki
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
Masahiro Masuda
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
Ryo Suzuki
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
Keisuke OTAKI
 
R intro
R introR intro
Slide
SlideSlide
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
Tomoki Yoshida
 
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
智啓 出川
 
R seminar on igraph
R seminar on igraphR seminar on igraph
R seminar on igraph
Kazuhiro Takemoto
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
Tatsuki SHIMIZU
 
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
Masahiro Sakai
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
NVIDIA Japan
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7swkagami
 

Similar to diffの真髄 (20)

KETpic できれいな図を書こう
KETpic できれいな図を書こうKETpic できれいな図を書こう
KETpic できれいな図を書こう
 
diff template library
diff template librarydiff template library
diff template library
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
Rを用いたGIS
Rを用いたGISRを用いたGIS
Rを用いたGIS
 
データとは何か
データとは何かデータとは何か
データとは何か
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
R intro
R introR intro
R intro
 
Slide
SlideSlide
Slide
 
CMSI計算科学技術特論B(12) 大規模量子化学計算(1)
CMSI計算科学技術特論B(12) 大規模量子化学計算(1)CMSI計算科学技術特論B(12) 大規模量子化学計算(1)
CMSI計算科学技術特論B(12) 大規模量子化学計算(1)
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
 
R seminar on igraph
R seminar on igraphR seminar on igraph
R seminar on igraph
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7
 

diffの真髄