第二章 背景說明
2.4 傳統型樹編輯距距離的演算法
在傳統型成本模型下,最具代表性,也是近年來這類研究引用最多的 論文就是 Kaizhong Zhang 和 Denis Shasha 在 1989 年所提的[ZS89]。
首先,我們用後序法來追蹤一顆樹,以後序追蹤的順序來標示樹中的 每一個節點。以左下圖為例,為一顆樹 T 用後序追蹤標號後的情形。
如下圖所示。
5
1 2 3
5
1 2 4
4 3
圖表2.9 使用後序追蹤對樹標號 之間的編輯距離。我們用 forestdist 函式來表示兩個有序 forest 間 的編輯距離,如下圖。
圖表2.10 forestdist(S[1..3],T[1..5])
用 treedist 函式來表示兩顆樹的編輯距離,如下圖。
forestdist(S[1..3],T[1..5]) 2
S T
圖表2.11 treedist(S[4],T[5])
本篇論文中,在不造成混淆的狀況下,treedist、forestdist 的第 一個參數都表示左邊那個顆樹的節點,第二個參數都表示右邊那個顆 樹的節點,因此上述圖中treedist(S[4],T[5])=forestdist(1..4,1..5),也可 直接表示成treedist(4,5)=forestdist(S[1..4],T[1..5])。
接下來我們來看 forestdist 的遞廻關系式。首先,forestdist 可以 有下列初始化關系
forestdist(θ,θ)=0
forestdist(lleaf(anci)..i,θ)=forestdist(lleaf(anci)..i-1,θ)+ (i ) forestdist(θ,lleaf(ancj)..j)=forestdist(θ,lleaf(ancj)..j-1)+ ( j)
γ γ
→ Λ Λ →
其中anci anc(i) ancj anc(j)∈
,∈
。在forestdist(lleaf(anci)..i,lleaf(ancj)..j) 中,我們以s[i]和 t[j]可簡單的分 為三種狀況,下列式子中,anci(ancj)表示節點 i(節點 j)的祖先。
示意圖如下。
treedist(S[4],T[5])= 2 forestdist(S[1..4],T[1..5])
4 S T
lleaf(anci) anci
lleaf(ancj)
forestdist(lleaf(anci)..i-1,lleaf(ancj)..j)+ (s[i]
γ → Λ
)。 狀況二:插入節點 jforestdist(lleaf(anci)..i,lleaf(ancj)..j-1)+ (
γ Λ →
t[j])。 狀況三:節點 i 的標籤換為節點 j 的標籤forestdist(lleaf(anci)..i-1,lleaf(ancj)..j-1)+ (s[i]
γ →
t[j])。 由上述三種狀況,forestdist 的遞廻關系式如下:forestdist(lleaf(anci)..i,lleaf(ancj)..j)=
forestdist(lleaf(anci)..i-1,lleaf(ancj)..j)+ (s[i] ) min forestdist(lleaf(anci)..i,lleaf(ancj)..j-1)+ ( t[j])
forestdist(lleaf(anci)..i-1,lleaf(ancj)..j-1)+ (s
lleaf(anci)或 lleaf(j)≠lleaf(ancj)時,以下圖說明。
圖表2.13
在此情況下,s[i]和 t[j]本身即為一顆子樹的根節點,因此,若 lleaf(i) 為i',lleaf(j) 為 j',狀況三又可寫成下列式子:
forestdist(lleaf(anci)..i'-1,lleaf(ancj)..j'-1)+forestdist(i'..i,j'..j)+ (s[i] t[j]) forestdist(lleaf(anci)..i'-1,lleaf(ancj)..j'-1)+treedist(i,j)
γ
→⇒
因此根據上述推導,forestdist 可寫成下列遞迴關係式。
令i anc(i) j anc(j)∈ , ∈ ,則:
狀況一:若lleaf(i)=lleaf(s) 且 lleaf(j)=lleaf(t)
…
S[lleaf(anci)..lleaf(i-1)] T[lleaf(ancj)..lleaf(j-1)]forestdist(S[lleaf(i)..s],T[lleaf(j)..t])=
forestdist(lleaf(i)..s-1,lleaf(j)..t)+ (S[s] ) min forestdist(lleaf(i)..s,lleaf(j)..t-1)+ ( T[t])
forestdist(lleaf(i)..s-1,lleaf(j)..t-1)+ (S[s] T[t])
γ
狀況二:若lleaf(i) lleaf(s)≠ 或lleaf(j) lleaf(t)≠ forestdist(S[lleaf(i)..s],T[lleaf(j)..t])=
forestdist(lleaf(i)..s-1,lleaf(j)..t)+ (S[s] ), forestdist(lleaf(i)..s,lleaf(j)..t-1)+ ( T[t]), min
第一、 我們可使用動態規畫(Dynamic Programming)的方式求解。
第二、 在計算 treedist(i,j)之前必需先求得 treedist(s,t)的 值。同時,這也說出我們可以使用下而上(bottom-up)的演算方 式求解。
第三、 由上述遞迴關系式中,當 s 在 lleaf(i)到 i 的路徑上,且 t 在 lleaf(j)到 j 的路徑上時,無需計算 treedist(s,t)。因為 treedist(i,j)在計算的時候就會順便求出 treedist(s,t)了。
因此,我們定義樹 S 中這些關鍵的節點為 LR_keyroots。定義如下:
LR_keyroots(S) = {k| exist no k'>k such that lleaf(k)=lleaf(k')}
圖表2.14 LR_keyroots 在樹 S 中 LR_keyroots(S)={3,5,6};在樹 T 中
主要的演算法便可寫成下列形式:
輸入:樹 S 及樹 T
輸出:treedist(i,j),其中1 i |S|,1 j |T|≤ ≤ ≤ ≤
1 Preprocessing(compute lleaf(),LR_keyroots1,LR_keyroots2)
LR_keyroots1 LR_keyroots(S) LR_keyroots2 LR_keyroots(T) main loop
2 for i'=1 to |LR_keyroots(S)|
3 for j'=1 to |LR_keyroots(T)| 陣列 FD 來計算。例如,當我們要求 treedist(4,6)也就是填入 D[4,6]
值時。以下圖為例。
故 forestdist(1..3,1..4)=
forestdist(1..1,0)+treedist(3,4)
圖表2.16
因此,對每一個 D[i,j],函式 treedist(i,j),表列如下。
1 initial step main loop
forestdist(lleaf(i)..s-1,lleaf(j)..t)+ (S[s] ) min forestdist(lleaf(i)..s,lleaf(j)..t-1)+ ( [ ])
forestdist(lleaf(i)..s-1,lleaf(j)..t-1)+ ( [ ] [ ]) treedist(s,t) = forestdist(
forestdist(lleaf(i)..s-1,lleaf(j)..t)+ (S[s] ), forestdist(lleaf(i)..s,lleaf(j)..t-1)+
圖表2.17 treedist(i,j)
空間複雜度分析
整個演算法在 treedist 時使用一個固定的二維陣列,在 forestdist 時使用一個暫時的二維陣列。因此,空間複雜度為Ο(|S||T|)。
時間複雜度分析
首先,我們知道,每一個 LR_keytoos 都有一個 lleaf,故對一顆樹 S 來說|LR_keyroots(S)| |L |≤ S 。
在上述推導過程中,我們得知,不是每一個子樹對子樹的編輯距離都 需要計算,因此,一個節點在參與演算法計算的程度由節點的深度決 定。我們對樹 X 中的節點 i 可定義節點的截斷深度(collapse depth) 如下:
LR_colldephth(i)=|anc(i)∩LR_keyroots(S)|
則樹 X 的 collapse depth 可用下式表示。
{ }
LR_colldephth(X)=max LR_colldephth(i) 因此我們可得下式:
X X X X
LR_colldephth(i) min(L ,D )≤ ⇒LR_colldephth(X) min(L ,D )≤ 且下式成立,
i=|LR_keyroots| j=|X|
i=1 j=1
treesize(X[i])= |LR_colldepth(j)|
∑ ∑
。D(S[i],θ)+ min{D(S[i ],T[j])-D(S[i ],θ)}
≤ ≤s
其中