字符串匹配--Karp-Rabin算法,--karp-rabin算法
主要特征
1、使用hash函數
2、預處理階段時間復雜度O(m),常量空間
3、查找階段時間復雜度O(mn)
4、期望運行時間:O(n+m)
本文地址:http://www.cnblogs.com/archimedes/p/karp-rabin-algorithm.html,轉載請注明源地址。
算法描述
在大多數實際情況下,Hash法提供了避免二次方比較時間的一種簡單的方法. 不同於檢查文本中的每一個位置是否匹配,只檢查模式串和指定文本窗口的相似性似乎更高效. hash函數被用來檢查兩個字符串的相似度.
- 有利於字符串匹配的hash函數應該有如下的性能:
-
1.
高效可計算;
-
2.
對字符串高度識別;
-
3.
hash(y[j+1 .. j+m]) 必須要很容易計算 hash(y[j .. j+m-1]) 和y[j+m]:
hash(y[j+1 .. j+m])= rehash(y[j], y[j+m], hash(y[j .. j+m-1]).
對於一個單詞w 長度為m,hash(w) 定義如下:
hash(w[0 .. m-1])=(w[0]*2m-1+ w[1]*2m-2+···+ w[m-1]*20) mod q
其中q 是一個很大的數.
rehash(a,b,h)= ((h-a*2m-1)*2+b) mod q
Karp-Rabin 算法的預處理階段由計算hash(x)構成. 在常量空間和O(m) 執行時間內完成.
在搜索階段,使用hash(y[j .. j+m-1]) 0 j < n-m,比較hash(x) 就足夠了. 如果hash值相等,依然需要逐個字符去比較 x=y[j .. j+m-1]是否相等.
Karp-Rabin算法的搜索階段的時間復雜度為:O(mn) (例如在an 中搜索 am).期望比較次數為: O(n+m).
舉例
預處理階段: hash[y]=17597
搜索階段:
第1次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[0 .. 7]) = 17819
第2次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[1 .. 8]) = 17533
第3次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[2 .. 9]) = 17979
第4次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[3 .. 10]) = 19389
第5次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[4 .. 11]) = 17339
第6次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
1
2
3
4
5
6
7
8
G
C
A
G
A
G
A
G
hash(y[5 .. 12]) = 17597
第7次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[6 .. 13]) = 17102
第8次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[7 .. 14]) = 17117
第9次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[8 .. 15]) = 17678
第10次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[9 .. 16]) = 17245
第11次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[10 .. 17]) = 17917
第12次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[11 .. 18]) = 17723
第13次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[12 .. 19]) = 18877
第14次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[13 .. 20]) = 19662
第15次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[14 .. 21]) = 17885
第16次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[15 .. 22]) = 19197
第17次嘗試
G
C
A
T
C
G
C
A
G
A
G
A
G
T
A
T
A
C
A
G
T
A
C
G
G
C
A
G
A
G
A
G
hash(y[16 .. 23]) = 16961
上面的例子中Karp-Rabin 算法執行8個字符的比較.
C代碼實現
// Completed on 2014.10.7 8:45
// Language: C99
//
// 版權所有(C)codingwu (mail: [email protected])
// 博客地址:http://www.cnblogs.com/archimedes/
#define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))
int KR(char *x, int m, char *y, int n) {
int d, hx, hy, i, j;
/* 預處理*/
/* 計算 d = 2^(m-1) 使用左移位運算操作 */
for (d = i = 1; i < m; ++i)
d = (d<<1);
for (hy = hx = i = 0; i < m; ++i) {
hx = ((hx<<1) + x[i]);
hy = ((hy<<1) + y[i]);
}
/* 搜索*/
j = 0;
while (j <= n-m) {
if (hx == hy && memcmp(x, y + j, m) == 0)
return j;
hy = REHASH(y[j], y[j + m], hy);
++j;
}
}
參考資料
- AHO, A.V., 1990, Algorithms for finding patterns in strings. in Handbook of Theoretical Computer Science, Volume A, Algorithms and complexity, J. van Leeuwen ed., Chapter 5, pp 255-300, Elsevier, Amsterdam.
- CORMEN, T.H., LEISERSON, C.E., RIVEST, R.L., 1990. Introduction to Algorithms, Chapter 34, pp 853-885, MIT Press.
- CROCHEMORE, M., HANCART, C., 1999, Pattern Matching in Strings, in Algorithms and Theory of Computation Handbook, M.J. Atallah ed., Chapter 11, pp 11-1--11-28, CRC Press Inc., Boca Raton, FL.
- GONNET, G.H., BAEZA-YATES, R.A., 1991. Handbook of Algorithms and Data Structures in Pascal and C, 2nd Edition, Chapter 7, pp. 251-288, Addison-Wesley Publishing Company.
- HANCART, C., 1993. Analyse exacte et en moyenne d'algorithmes de recherche d'un motif dans un texte, Ph. D. Thesis, University Paris 7, France.
- CROCHEMORE, M., LECROQ, T., 1996, Pattern matching and text compression algorithms, in CRC Computer Science and Engineering Handbook, A. Tucker ed., Chapter 8, pp 162-202, CRC Press Inc., Boca Raton, FL.
- KARP R.M., RABIN M.O., 1987, Efficient randomized pattern-matching algorithms. IBM J. Res. Dev. 31(2):249-260.
- SEDGEWICK, R., 1988, Algorithms, Chapter 19, pp. 277-292, Addison-Wesley Publishing Company.
- SEDGEWICK, R., 1988, Algorithms in C, Chapter 19, Addison-Wesley Publishing Company.
- STEPHEN, G.A., 1994, String Searching Algorithms, World Scientific.
字符串匹配算法
樓主,你指的“多重算法”是什麼意思? 多重匹配但只掃描一次?
字符串匹配算法的基本思想是什?
最常見的是樸素字符串匹配,還有KMP算法匹配,你問的是他們中的一個?或者是其他什麼算法嗎?