第五章 字串專題 ---------------- 5.12 字串匹配之PabinKarp
題目:
假如要判斷字串A"ABA"是不是字串B"ABABABA"的子串。
解法一:
暴力破解法, 直接列舉所有的長度為3的子串,然後依次與A比較,這樣就能得出匹配的位置。 這樣的時間複雜度是O(M*N),M為B的長度,N為A的長度。
解法二:
Rabin-Karp演算法:
思想:假設待匹配字串的長度為N,目標字串的長度為M(M>N);首先計算待匹配字串的hash值,計算目標字串前N個字元的hash值;比較前面計算的兩個hash值,比較次數M-N+1:若hash值不相等,則繼續計算目標字串的下一個長度為N的字元子串的hash值,若hash值相同,則需要使用比較字元是否相等再次判斷是否為相同的子串(這裡若hash值相同,則直接可以判斷待匹配字串是目標字串的子串,之所以需要再次判斷字元是否相等,是因為不同的字元計算出來的hash值有可能相等,稱之為hash衝突或hash碰撞,不過這是極小的概率,可以忽略不計)。
雜湊函式定義如下:
其中Cm表示字串中第m項所代表的特地數字,有很多種定義方法,我習慣於用java自帶的char值,也就是ASCII碼值。java中的char是16位的,用的Unicode編碼,8位的ASCII碼包含在Unicode中。b是雜湊函式的基數,相當於把字串看作是b進位制數。h是防止雜湊值溢位。
程式碼:
public class RabinKarp {
public static void main(String[] args) {
String s = "ABABABA";
String p = "ABA";
match(p, s);
}
/**
* @param p 模式
* @param s 源串
*/
static void match(String p,String s){
long hash_p = hash(p);//p的hash值
int p_len = p.length();
for (int i = 0; i+p_len<= s.length(); i++) {
long hash_i = hash(s.substring(i, i+p_len));// i 為起點,長度為p_len的子串的hash值
if (hash_p==hash_i) {
System.out.println("match:"+i);
}
}
}
final static long seed = 31; // 進位制數
/**
* 不同的字元計算出來的hash值相同 稱為hash衝突
* 使用100000個不同字串產生的衝突數,大概在0~3波動,使用100百萬不同的字串,衝突數大概110+範圍波動。
* @param str
* @return
*/
private static long hash(String str) {
long h = 0;
for (int i = 0; i !=str.length(); i++) {
// 這個計算方式就是 An²+Bn+c 的迴圈表示式,而這個計算方式就是二進位制轉十進位制的計算方式
// 這裡n=31,可以理解為轉為31進位制
h = seed * h + str.charAt(i);
}
return h%Long.MAX_VALUE; // 防止hash值過大
}
}
相關文章
- 第五章 字串專題 ---------------- 字串匹配(二)----KMP演算法字串匹配KMP演算法
- 第五章 字串專題 ---------------- 字串匹配(三)----字尾陣列演算法字串匹配陣列演算法
- 第五章 字串專題 ---------------- 5.5 題解:壓縮字串字串
- 第五章 字串專題 ---------------- 5.2 題解:巧妙翻轉字串字串
- 第五章 字串專題 ---------------- 5.4 實踐:替換字串中的空格字串
- 第五章 字串專題 ---------------- 5.8 題解:將字串中按單詞翻轉字串
- 第五章 字串專題 ---------------- 5.1 題解:判斷字串有無重複字元字串字元
- 字串匹配模式問題字串匹配模式
- 第五章 字串專題 ---------------- 5.7 題解:旋轉詞字串
- 第五章 字串專題 ---------------- 5.6 解題:判斷兩字串的字符集是否相同字串
- 字串匹配字串匹配
- 第五章 字串專題 ---------------- 5.11 題解:最短摘要的生成字串
- 第五章 字串專題 ---------------- 5.10 題解:神奇的迴文串字串
- 第五章 字串專題 ---------------- 5.9 題解:去掉字串中連線出現的k次的0字串
- 字串專題字串
- 專題:字串字串
- 【字串匹配】KMP字串匹配KMP
- 字串匹配之KMP《演算法很美》字串匹配KMP演算法
- 字串匹配問題——KMP演算法字串匹配KMP演算法
- 第五章 字串專題 ---------------- 5.3 走出思維誤區:變形詞問題字串
- 【專題訓練】字串字串
- Bitset 亂搞字串匹配字串匹配
- BZOJ4259: 殘缺的字串(FFT 字串匹配)FFT字串匹配
- 演算法之字串——正規表示式匹配演算法字串
- 匹配字串之——KMP演算法深入理解字串KMP演算法
- 提高組字串專題1字串
- KMP字串模式匹配詳解KMP字串模式
- 【學習筆記】字串匹配筆記字串匹配
- 字串——正規表示式匹配字串
- 字串匹配演算法之 BF 和 KMP 講解字串匹配演算法KMP
- 字串匹配演算法:KMP字串匹配演算法KMP
- KMP字串匹配演算法KMP字串匹配演算法
- [JS高程] 字串模式匹配方法JS字串模式
- 字串匹配演算法(一)字串匹配演算法
- KMP字串匹配學習筆記KMP字串匹配筆記
- DI String Match 增減字串匹配字串匹配
- Python學習手冊之捕獲組和特殊匹配字串Python字串
- OpenJudge 帶萬用字元的字串匹配字元字串匹配