字串演算法StringAlgorithms.docxVIP

  • 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)

1亿VIP精品文档

相关文档