- 2
- 0
- 约3.69千字
- 约 39页
- 2017-04-17 发布于湖北
- 举报
字串演算法 String Algorithms
本次大綱
1 - 一些基本的字串演算法符號名詞介紹
2 - Rabin Karp簡介
3 - 自動機的演算法簡介
4 - KMP演算法本體介紹
5 - 嗚喔 好題目
符號
Σ 組成字串的字元集合
|Σ|組成字串的字元集合大小
Σ* 由Σ所組成的所有”有限長度”的字串
ε 空字串 屬於Σ*
名詞
Prefix 一字串的前置
譬如字串abcccd
abc是他的前置
ab也是他的前置 也是abc的前置
Suffix
譬如字串abcccd
cccd是他的前置
ccd也是他的前置 也是cccd的前置
Rabin Karp Algorithms
想法核心:把一個字串看成數字
若一個字串abcdabc
想法:視為1234123
先不考慮一個字串是否會overflow
把字串”轉換成”數字去做比對
Rabin Karp Algorithms
實作想法:用一個Table去實現一個字元的Mapping
Ex: abcdabcd
→a對應到1, b對應到2, c對應到3, d對應到4
所以一個|Σ|為N的字串
表示成N進位的數字
Rabin Karp Algorithms
Rabin Karp Algorithms
波動拳 ↓ → + A
Rabin Karp Algorithms
昇龍拳 →↓ → + A
Rabin Karp Algorithms
這是我自己”實作”的應用
如果遊戲你用字串比對是用迴圈去比對招數表,同時間需要的次數一多可能就會慢
如此就可能會發生…
Rabin Karp Algorithms
Rabin Karp Algorithms
實作上,Rabin Karp對於一個產生數字不大(在INT或LONG LONG) 的字串集合 有相當大的優勢 (譬如遊戲招數)
所以問題應該經由分析之後,才確認採用何種演算法,並不是某一種演算法都一定比較快
Rabin Karp Algorithms
最後實作細節:
你可能發現升龍拳跟波動拳字串不一樣長了
假設你現在得到數字x
比對波動拳用(x)%(N)^3 (有三個按鍵要比對)
升龍拳用(x)%(N)^4(有四個按鍵要比對)
其他相關的細節問題 也可以用modulus來解決
String Matching With finte automata
想法核心:想成一個自動機的狀態轉移
初始狀況為q0
所有狀況為Q這個集合
當在一狀況q下 遇到字元alpha
那麼下一個狀態會依循著這新的指令轉移
String Matching With finte automata
如果將狀態看成一個數字 其實就跟Rabin Karp很類似了 假設目前狀態是15456,得到新的字元g,他代表7這個數字,那新的狀態就是154567
那字串比對的目標就是一個Final State
假設自動機到了最終狀態 那代表已經讀到了一個要尋找的字串
本篇將不再多在此處著墨,有興趣的人可以閱讀Introduction to algorithms 2/e的page 916 – page 922
KMP Algorithms
核心觀念:將之前比對過的資料充分利用
實作資訊:
Si代表一字串從S[0]…S[i]
failure function definition : failure[i]代表最長Si的prefix與他自己的suffix相符是多少 而failure[i] i (注意這個限制!)
KMP Algorithms
fail function diagram(圖例)
Ex: Sq = abcwerabc
則failure[q] = ?
以本例的話 failure[q] = 2
因為Sq的prefix最長S2與後面Sq的suffix相等
雖然S1也符合 但是S2才是最長的
KMP Algorithms
KMP Algorithms
How to use failure function
主要字串
比對字串
當比對出錯誤時,我們可以怎麼省工夫?
這兩段相同
你會發現這段字串
跟綠色字串的關係 (繼續...)
KMP Algorithms
目前的狀況
T’’ =
Sub’ =
有多少已經比對過?
我們會想知道Sub ”已經知道”的Prefix最長可以跟T’的Suffix相同的 是到哪邊
KMP Algorithms
新的比對的狀況
我們知道因為上下兩個子字串完全相等
那這三格是”最長”的prefix of T’’等於suffix of Sub’
因此就不會有”更好”的”省略比對”選擇了
KMP Algorithms
新的比對的狀況
省略不必要的比對
我們就拿Sub第四個元素重新與T第十個元素比對
你會發現找這個最長的prefix步驟其實就是
假設比對到Sub[j
原创力文档

文档评论(0)