生活随笔
收集整理的這篇文章主要介紹了
Java实现算法导论中Rabin-Karp字符串匹配算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Rabin-Karp算法的思想:
假設子串的長度為M,目標字符串的長度為N計算子串的hash值計算目標字符串中每個長度為M的子串的hash值(共需要計算N-M+1次)比較hash值如果hash值不同,字符串必然不匹配,如果hash值相同,還需要使用樸素算法再次判斷
在算法導論中,hash是通過基數來實現,將每個字符串映射成d進制的數字,再利用模來實現,具體可結合導論中來理解,參考代碼如下:
package cn.ansj;public class RabinKarp {public static void RabinKarpAlogrithm(char[] T,char[] P, int d,int q){int n=T.length;int m=P.length;if( n < m) return ;int h = 1;for(int i=1; i<=m-1; i++) // 計算高度 h h = h*d%q;//m-1個d相乘然后模q//預處理,計算p, t0 int p=0, t=0;for(int i=0; i<m; i++) {p = (( d*p + P[i]) % q); t = (( d*t + T[i]) % q);}//開始匹配for(int s=0; s <n-m+1; s++) { if( p == t ){int i=0;for(i=0; i<m; i++)// 進一步驗證if(P[i]!=T[s+i])break;if(i==m) System.out.println("Pattern ocurs with shift:"+s);}if( s < n-m )t= (d* (t - T[s]*h%q) + T[s+m]) % q; // 計算ts+1}System.out.println("string matching ends");}public static void main(String[] args){String strT="2359023141526739921";String strP="31415";char[] T=strT.toCharArray();char[] P=strP.toCharArray();int d=10;int q=13;RabinKarp.RabinKarpAlogrithm(T,P,d,q); }
}
執行結果:
Pattern ocurs with shift:6
string matching ends
總結
以上是生活随笔為你收集整理的Java实现算法导论中Rabin-Karp字符串匹配算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。