字符串匹配算法—單模式匹配—RK 算法
一、RK算法
RK 算法的全稱叫 Rabin-Karp 算法,是由它的兩位發明者 Rabin 和 Karp 的名字來命名的。
每次檢查主串與子串是否匹配,需要依次比對每個字符,所以 BF 算法的時間復雜度就比較高,是 O(n*m)。我們對樸素的字符串匹配算法稍加改造,引入哈希算法,時間復雜度立刻就會降低。
RK 算法的思路是這樣的:我們通過哈希算法對主串中的 n-m+1 個子串分別求哈希值,然后逐個與模式 串的哈希值比較大小。如果某個子串的哈希值與模式串相等,那就說明對應的子串和模式串匹配了(這 里先不考慮哈希沖突的問題)。因為哈希值是一個數字,數字之間比較是否相等是非??焖俚?,所以模 式串和子串比較的效率就提高了。
可以設計一個hash算法: 將字符串轉化成整數,利用K進制的方式 數字1-0 :
10進制 123的拆解
100+20+3=123
小寫字母a-z:26進制
大小寫字母a-Z:52進制
大小寫字母+1-0:62進制
以只是小寫字母的26進制為例
字符串“abc”轉化成hash值的算法是:
a的ASCII碼是97
b的ASCII碼是98
c的ASCII碼是99
65572+2548+99=68219
字符串“abc”轉化成hash值是68219
如果覺得計算太麻煩也可以從97開始,
即 字符串“abc”轉化成hash值的算法是:
0+26+2=28 代碼如下:
時間復雜度
RK 算法的的時間復雜度為O(m+n)
m:為匹配串長度
n:為主串長度
應用
適用于匹配串類型不多的情況,比如:字母、數字或字母加數字的組合 62 (大小寫字母+數字)