• 沒有找到結果。

傳統型樹編輯距距離的演算法

第二章 背景說明

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]

γ → Λ

)。 狀況二:插入節點 j

forestdist(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

其中

n

i為節點 i 下面的子節點總數。i 為S[i] 的其中一個子節點。其s

相關文件