LCS (Longest Common Subsquence)

如果值有一樣,那格要填的格子分數由左上角那格數值+1,並利用箭頭紀錄是由左上角來的,
否則選上面或左邊格子數值最大的來填入,並用箭頭紀錄來源。

最後在表格找最大的數值,由它開始往前推,找有左上箭頭的起始值,即為LCS的內容

箭頭說明
3 (終點)
\( \nwarrow \)4 (起點)

Exercise

有兩字串A=abcbc和B=aaccb,找這兩字串的LCS。
\( \varepsilon = \emptyset \)
A\B \( \varepsilon \) a a c c b
\( \varepsilon \) 0 0 0 0 0 0
a 0
b 0
c 0
b 0
c 0


有\( \varepsilon \)的row和column當作是第0個row和第0個column。
(台譯: row為列, column為行。)
(其他譯: row為行, column為列。)
所以使用英文來解釋,row是橫的(左右),column是直的(上下)。

開始填表



A\B \( \varepsilon \) a a c c b
\( \varepsilon \) 0 0 0 0 0 0
a 0 \( \nwarrow \)1 \( \nwarrow \)1 \( \leftarrow \)1 \( \leftarrow \)1 \( \leftarrow \)1
b 0 \( \uparrow \)1 \( \leftarrow \)1 \( \leftarrow \)1 \( \leftarrow \)1 \( \nwarrow \)2
c 0 \( \uparrow \)1 \( \leftarrow \)1 \( \nwarrow \)2 \( \nwarrow \)2 \( \leftarrow \)2
b 0 \( \uparrow \)1 \( \leftarrow \)1 \( \uparrow \)2 \( \leftarrow \)2 \( \nwarrow \)3
c 0 \( \uparrow \)1 \( \leftarrow \)1 \( \nwarrow \)2 \( \nwarrow \)3 \( \leftarrow \)3

說明:

上方按鈕操作表格。

(A拿自己第一個a和B拿自己第一個a比對)
看第一個row的a對上第一個column的a,有match到,所以左上角那格數值+1(左上角那個為0)=0+1=1, 箭頭往左上。

(A拿自己第一個a和B拿自己aa比對)
看第一個row的a對上第二個column的a,有match到,所以左上角那格數值+1(有match到是基於第二個column的a,這跟第一個column的a沒有關係喔!), 箭頭往左上。

(A拿自己第一個a和B拿自己aac比對)
第一個row的a對上第三個column的c,沒有match到,所以看上面左邊的數值哪個較大就選它,箭頭也選那邊,這裡選左邊那個。
注意!! 如果上面左邊數值一樣,都可以選,不會影響最長長度,只會影響最後序列內容是什麼排列,這也就意味著序列不唯一。

(A拿自己第一個a和B拿自己aacc比對)
第一個row的a對上第四個column的c,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己第一個a和B拿自己aaccb比對)
第一個row的a對上第五個column的b,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己ab和B拿自己a比對)
第二個row的b對上第一個column的a,沒有match到,上面左邊選較大的值,箭頭向上。

(A拿自己ab和B拿自己aa比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第二個row的b對上第二個column的a,沒有match到,上面左邊選較大的值,數值都一樣大,都可以選,這裡箭頭選向左。

(A拿自己ab和B拿自己aac比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第二個row的b對上第三個column的c,沒有match到,上面左邊選較大的值,數值都一樣大,都可以選,這裡箭頭選向左。

(A拿自己ab和B拿自己aacc比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第二個row的b對上第四個column的c,沒有match到,上面左邊選較大的值,數值都一樣大,都可以選,這裡箭頭選向左。

(A拿自己ab和B拿自己aaccb比對)
第二個row的b對上第五個column的b,有match到, 左上那格+1=2,箭頭向左上。

(A拿自己abc和B拿自己a比對)
第三個row的c對上第一個column的a,沒有match到,上面左邊選較大的值,箭頭向上。

(A拿自己abc和B拿自己aa比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第三個row的c對上第二個column的a,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己abc和B拿自己aac比對)
第三個row的c對上第三個column的c,有match到, 左上那格+1=2,箭頭向左上。

(A拿自己abc和B拿自己aacc比對)
第三個row的c對上第四個column的c,有match到, 左上那格+1=2(這是基於ab和aa有1個長度的共同子序列基礎下,再加上B現在這個c和A現在這個c有match到才+1的),箭頭向左上。

(A拿自己abc和B拿自己aaccb比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第三個row的c對上第五個column的b,沒有match到,上面左邊選較大的值,數值都一樣大,都可以選,這裡箭頭選向左。

(A拿自己abcb和B拿自己a比對)
第四個row的b對上第一個column的a,沒有match到,上面左邊選較大的值,箭頭向上。

(A拿自己abcb和B拿自己aa比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第四個row的b對上第二個column的a,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己abcb和B拿自己aac比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第四個row的b對上第三個column的c,沒有match到,上面左邊選較大的值,箭頭向上。

(A拿自己abcb和B拿自己aacc比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第四個row的b對上第四個column的c,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己abcb和B拿自己aaccb比對)
第四個row的b對上第五個column的b,有match到, 左上那格+1=3,箭頭向左上。

(A拿自己abcbc和B拿自己a比對)
第五個row的c對上第一個column的a,沒有match到,上面左邊選較大的值,箭頭向上。

(A拿自己abcbc和B拿自己aa比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第五個row的c對上第二個column的a,沒有match到,上面左邊選較大的值,箭頭向左。

(A拿自己abcbc和B拿自己aac比對)
第三個row的c對上第三個column的c,有match到, 左上那格+1=2,箭頭向左上。

(A拿自己abcbc和B拿自己aacc比對)
第五個row的c對上第四個column的c,有match到, 左上那格+1=3(這是基於abcb和aacc有2個長度的共同子序列基礎下,再加上B現在這個c和A現在這個c有match到才+1的),箭頭向左上。

(A拿自己abcbc和B拿自己aaccb比對)
注意! 這裡有一樣的值做選擇,箭頭方向會影響序列排列,並不會影響最長的結果。
第五個row的c對上第五個column的b,沒有match到,上面左邊選較大的值,數值都一樣大,都可以選,這裡箭頭選向左。

回推最佳解內容
找到最右下角最大數值為3,也就是最長共同子序列長度為3。
要找到序列,就從最右下開始回推,以陣列index的形式來說明,排除預設的0,這裡是\( 5\times 5 \)的矩陣,A字串為1到5,B字串也為1到5,舉例表格最右下角編號為[5][5]。
開始回推,[5][5]箭頭向左,到[5][4]箭頭向左上,這格標記起來,因為他們有共同的元素,接著順著箭頭到[4][3],箭頭向上,到[3][3],箭頭左上,標記,到[2][2]箭頭向左,到[2][1],箭頭向上,[1][1]箭頭向左上,標記,最後可得最長共同子序列長度為3,內容為acc(當然箭頭選擇上面左邊的不一樣,內容也會不一樣,這LCS內容可能為acb)。


Longest Incresing subsequence

假設有一組\( a_3a_2a_4a_8a_1\dots a_k \)要找最長遞增子序列,
那就將\( a_3a_2a_4a_8a_1\dots a_k \)整理成\( a_1a_2\dots a_k \),其中\( a_1< a_2<\dots < a_k\)
由\( \overbrace{a_3a_2a_4a_8a_1\dots}^{k \text{ terms}} \)和\( a_1a_2\dots a_k \)兩序列做LCS,即可得出LIS。

Longest Incresing substring

Def:
Two squences \( X=< x_1,x_2,\dots ,x_n > \text{ and } Y =< y_1,y_2,\dots ,y_m >\).

\( c[i,j]= \begin{cases} 0 &\text{,if }x_i\neq y_i \text{ or }i=0\text{ or }j=0\\ 1+c[i-1,j-1] &\text{,if }x_i=y_i \end{cases} \)
解釋
\( c[i,j] \)為在\( X \)拿\( x_i \)時,比對\( Y \)在\( y_j \)那格(cell)的結果。