字串演算法 string algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹...

39
字字字字字 String Algorithms 字字字字 1 - 字字字字字字字字字字字字字字字 2 - Rabin Karp 字字 3 - 字字字字字字字字字 4 - KMP 字字字字 字字 5 - 字字 字字字

Post on 19-Dec-2015

254 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

字串演算法 String Algorithms

• 本次大綱

• 1 - 一些基本的字串演算法符號名詞介紹• 2 - Rabin Karp 簡介• 3 - 自動機的演算法簡介• 4 - KMP 演算法本體介紹• 5 - 嗚喔 好題目

Page 2: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

符號• Σ 組成字串的字元集合• |Σ| 組成字串的字元集合大小• Σ* 由 Σ 所組成的所有”有限長度”的字串• ε 空字串 屬於 Σ*

Page 3: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

名詞• Prefix 一字串的前置

譬如字串 abcccdabc 是他的前置ab 也是他的前置 也是 abc 的前置

• Suffix譬如字串 abcccdcccd 是他的前置ccd 也是他的前置 也是 cccd 的前置

Page 4: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 想法核心:把一個字串看成數字

• 若一個字串 abcdabc• 想法:視為 1234123

• 先不考慮一個字串是否會 overflow• 把字串”轉換成”數字去做比對

Page 5: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 實作想法:用一個 Table 去實現一個字元的Mapping

• Ex: abcdabcd• →a 對應到 1, b 對應到 2, c 對應到 3, d 對應

到 4

• 所以一個 |Σ| 為 N 的字串• 表示成 N 進位的數字

Page 6: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

Page 7: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 波動拳 ↓ → + A

Page 8: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 昇龍拳 →↓ → + A

Page 9: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 這是我自己”實作”的應用

• 如果遊戲你用字串比對是用迴圈去比對招數表,同時間需要的次數一多可能就會慢

• 如此就可能會發生…

Page 10: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

Page 11: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 實作上, Rabin Karp 對於一個產生數字不大 ( 在 INT 或 LONG LONG) 的字串集合 有相當大的優勢 ( 譬如遊戲招數 )

• 所以問題應該經由分析之後,才確認採用何種演算法,並不是某一種演算法都一定比較快

Page 12: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

Rabin Karp Algorithms

• 最後實作細節:• 你可能發現升龍拳跟波動拳字串不一樣長了

• 假設你現在得到數字 x• 比對波動拳用 (x)%(N)^3 ( 有三個按鍵要比對 )• 升龍拳用 (x)%(N)^4( 有四個按鍵要比對 )• 其他相關的細節問題 也可以用 modulus 來解決

Page 13: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

String Matching With finte automata

• 想法核心:想成一個自動機的狀態轉移

• 初始狀況為 q0• 所有狀況為 Q 這個集合

• 當在一狀況 q 下 遇到字元 alpha• 那麼下一個狀態會依循著這新的指令轉移

Page 14: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

String Matching With finte automata

• 如果將狀態看成一個數字 其實就跟 Rabin Karp 很類似了 假設目前狀態是 15456 ,得到新的字元 g ,他代表 7 這個數字,那新的狀態就是 154567

• 那字串比對的目標就是一個 Final State• 假設自動機到了最終狀態 那代表已經讀到了一個要

尋找的字串

• 本篇將不再多在此處著墨,有興趣的人可以閱讀Introduction to algorithms 2/e 的 page 916 – page 922

Page 15: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 核心觀念:將之前比對過的資料充分利用

• 實作資訊:• Si 代表一字串從 S[0]…S[i]• failure function definition : failure[i] 代表最

長 Si 的 prefix 與他自己的 suffix 相符是多少 而 failure[i] < i ( 注意這個限制 !)

Page 16: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• fail function diagram( 圖例 )• Ex: Sq = abcwerabc• 則 failure[q] = ?

• 以本例的話 failure[q] = 2• 因為 Sq 的 prefix 最長 S2 與後面 Sq 的 suffix

相等• 雖然 S1 也符合 但是 S2 才是最長的

Page 17: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

Page 18: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• How to use failure function• 主要字串• 比對字串• 當比對出錯誤時,我們可以怎麼省工夫 ?• 這兩段相同• 你會發現這段字串• 跟綠色字串的關係 ( 繼續 ...)

Page 19: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 目前的狀況• T’’ =• Sub’ =• 有多少已經比對過 ?• 我們會想知道 Sub ” 已經知道”的 Prefix 最

長可以跟 T’ 的 Suffix 相同的 是到哪邊

Page 20: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 新的比對的狀況

• 我們知道因為上下兩個子字串完全相等• 那這三格是”最長”的 prefix of T’’ 等於

suffix of Sub’• 因此就不會有”更好”的”省略比對”選

擇了

Page 21: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 新的比對的狀況

• 省略不必要的比對• 我們就拿 Sub 第四個元素重新與 T 第十個元素比對• 你會發現找這個最長的 prefix步驟其實就是• 假設比對到 Sub[j] 不符合的時候• 就可以直接省略比對 failure[j] 個字元 並”重新比

對一次”該字元

Page 22: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 萬一又不符合 就不斷重複這樣的步驟

• 一樣省略不必要的比對 採用策略一樣是尋找最長的 prefix 與 suffix 相等的情況

• 我們就拿 Sub 第二個元素重新與 T 第十個元素比對• 這樣的步驟將持續到 j = -1 或者 Sub[j] 跟 T[i] 相等

Page 23: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 狀態的轉移

• 其實這樣的步驟 就是在使得狀態轉移• 轉移的是 j ,這樣的動作就像自動機一樣• 當你比對到新的字元• 你一定會進入新的狀態 => 比對成功 或者 j

= failure[j] 這樣來省略比對步驟

Page 24: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 程式碼實現 =>• Part 1 計算目標字串自己的 prefix 跟 suffix

的關係 (Failure function)• Part 2 利用 Failure function 去比對需要比對

的字串

Page 25: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• Failure Function 的實現

• 其實作法跟有 Failure Function 時與主字串比對的動作類似

• 假設已經知道之前的 Failure Function• 那目前的比對可能會產生兩種結果

Page 26: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• Failure Function 的實現

• 1. 成功比對 存入 Failure Function

Page 27: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• Failure Function 的實現

• 2. 比對失敗 進行 j 的狀態轉移,一樣利用之前已經比對過的結果,節省要比對的次數

Page 28: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• Failure Function 的小要點• 依照原本定義,圖片中藍色的段落是可以

重疊 ( 過半 ) 的,不要被圖片迷惑

Page 29: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 程式碼 (fail function)fail[0] = -1;for(int i = 1, j = -1; i < Sub.size(); i++){

while(j >= 0 && Sub[i] != Sub[j+1]) j = failure[j]; //避免重複比對 if(Sub[i] == Sub[j+1]) j++; // 比對成功failure[i] = j; //紀錄 failure function

}

Page 30: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

• 程式碼 (String matching KMP)for(int i = 0, j = -1; i < T.size(); i++){

while(j >= 0 && T[i] != Sub[j+1]) j = failure[j]; //避免重複比對 if(T[i] == Sub[j+1]) j++; // 比對成功if(j == S.size()-1) // 找到了目標字串{

cnt++; // 找到了一次j = failure[j];

}}

Page 31: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

KMP Algorithms

Page 32: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目

Page 33: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目

Page 34: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目

Page 35: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目• 題目大意:• 給定一字串 S ,試求最少需要加入幾個字

元在該字串後面,使該字串成為一個回文(palindrome)

• 譬如說 abcba 是一個回文 而 abcb 則不是

Page 36: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目• 出處 ACM UVA Contest Problem Set 11475 – • Extend to Palindrome

• 網址 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2470

Page 37: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目• 參考解答:• 設原本字串為 S ,一反轉字串為 S’• 則我們想要知道的是• S’ 字串 的 prefix 可以跟 S 的 suffix 相符合到

多長• 這樣一個看似無從下手的問題,就正好是

一個字串比對了,其中可以用 KMP 來實現加速

Page 38: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

好題目• 程式參考解答 個人網誌網址:• http://robertanders.pixnet.net/blog/post/

27122820

Page 39: 字串演算法 String Algorithms 本次大綱 1 - 一些基本的字串演算法符號名詞介紹 2 - Rabin Karp 簡介 3 - 自動機的演算法簡介 4 - KMP 演算法本體介紹

建議閱讀• Introductions to algorithms 2/e page.907- page.932 ( 如果自己覺得自習可以的話 )