【数据结构与算法】字符串匹配 BF算法 RK算法
BF 算法和 RK 算法
BM 算法和 KMP 算法
Trie 樹和 AC 自動機
一、BF 算法
1,BF算法是Brute Force的縮寫,中文譯作暴力匹配算法,也叫樸素匹配算法。
2,兩個概念:主串和模式串
如在字符串A中查找字符串B,則字符串A就是主串,字符串B就是模式串
將主串長度記為n,模式串的長度記作m。因為是在主串中查找模式串,所以n>m
3,BF算法的思想可概括為:我們在主串中,檢查起始位置分別是0,1,2……n-m且長度為m的n-m+1個子串,看有沒有更模式串匹配的。
4,極端情況下,如主串是“aaaaa…aaaaa”,模式串是“aaaab”。每次都比對m個字符,要比對n-m+1次,所以最壞的時間復雜度是O(mn)。
5,雖然BF算法時間復雜度很高,但在實際開發中使用的非常常見。
原因1:實際軟件開發中,大部分情況下,模式串和主串的長度都不會太長。每次模式串與主串中的子串匹配時,當中途不能遇到匹配的字符的時候,就可以停止,不需要全部對比一次。所以理論上最壞情況時間復雜度是O(mn),但這更多的是統計意義上的,大部分情況中,這個算法執行的很高效。
原因2:樸素字符串匹配算法思想簡單,代碼實現也非常簡單,簡單就意味著不容易出錯。工程中,在滿足性能要求的前提下,簡單是首選,也是常說的KISS(keep it Simple and Stupid)設計原則。
6。應用 Java IndexOf
處理小規模的字符串匹配
二、RK算法:
1,RK算法的全稱是Rabin-Karp算法,是兩位發明人的名字拼接。是BF算法的升級版
2,BF算法的問題在于每次檢查主串與子串是否匹配,需要依次對比每個字符,所以BF算法的時間復雜就比較高。但引入哈希算法,時間復雜度立即就會降低。
3,RK算法的思路:
通過哈希算法對主串中的n-m+1個子串分別求哈希值,
然后逐個于模式串的哈希值比較大小,如果相等就說明有對應的模式串。
4,通過哈希算法計算字符的哈希值時,需要遍歷子串中的每個字符,這只提供了模式串與子串比較的效率,但整體的效率并沒有提高。
5,為了提高哈希算法計算子串哈希值的效率,可以通過哈希算法的設計來解決。
假設要匹配的字符串的字符集中只包含k個字符,這就可以用一個k進制數來表示一個子串,這個k進制數轉化成k
進制,作為子串的哈希值。
6,這種哈希算法有個特點,在主串中,相鄰兩個子串的哈希值的計算公式有一定關系。
7,RK算法的時間復雜度:
①:整個RK算法包含兩個部分,計算子串哈希值和模式串哈希值與子串哈希值之間的比較。
②:第一部分,只需要掃描一遍主串就能計算出所有子串的哈希值了,復雜度是O(n)。
③:模式串哈希值與每個子串哈希值之間的比較時間復雜度是O(1),總共需要比較n-m+1個子串的哈希值,所有,這部分的時間復雜度也是O(n)。
所以RK算法整體時間復雜度就是O(n)。
8,如果模式串很長,相應的主串中子串也會很長,通過上面的哈希算法計算得到的哈希值就可能很大,如果超過了計算機中整形數據可以表示范圍,該如何解決?
答:我們可以把字符串中每個字母的數字相加(每個字母代表一個素數),最后得到的和作為哈希值。這種哈希算法產生的哈希值的數據范圍就相對要小很多。
9,若出現哈希沖突如何解決?
答:如果兩值相等,比較子串中每個字符。
所以,哈希算法中的沖突概率要相對控制得低一些,如果存在大量沖突,就會導致RK算法的時間復雜度退化,效率下降。極端情況下,如果存在大量的沖突,每次都要對比子串和模式串本身,時間復雜度就會退化成O(n*m)。
筆記整理來源: 王爭 數據結構與算法之美
總結
以上是生活随笔為你收集整理的【数据结构与算法】字符串匹配 BF算法 RK算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大象装企营销:装饰公司如何通过差异化营销
- 下一篇: 内存总结