KMP 字符串匹配算法
2011-05-07 21:19
183 查看
KMP算法是一种线性时间字符串匹配算法,这个算法不用计算变迁函数,匹配时间为O(n),只用到了辅助函数π,这是在O(m)的时间内根据模式预先计算出来的。
模式的前缀函数π包含有模式与自身的位移进行匹配的信息。简单的来说,如果字符串中某前缀的后缀包含了某前缀,则在比较的时候能够免去对无用位移进行测试。
构件π函数的伪代码如下所述
m=length(P);
k=0;
π(1)=0;
for q=2 to m
{
while(k>0&&P(k+1)==P(q))
k=π(k);
if(P(k+1)==P(q))
k=k+1;
π(q)=k;
}
简单的用java代码实现如下所示
对于题目:在n个txt文档中找含有字符串“love”的文档。这个相对于上述KMP算法就简单的多了。该字符串中无重复字符,更不用提重复的前后缀了。在匹配的时候,指针扫描,如果出现不匹配现象,直接当前文档位置的字符从l开始匹配即可。查找时间为线性时间。
模式的前缀函数π包含有模式与自身的位移进行匹配的信息。简单的来说,如果字符串中某前缀的后缀包含了某前缀,则在比较的时候能够免去对无用位移进行测试。
构件π函数的伪代码如下所述
m=length(P);
k=0;
π(1)=0;
for q=2 to m
{
while(k>0&&P(k+1)==P(q))
k=π(k);
if(P(k+1)==P(q))
k=k+1;
π(q)=k;
}
简单的用java代码实现如下所示
package algorithmTraining; public class KMP { public static void main(String args[]) { KMP k=new KMP("ababababababababaca","abab"); int [] pai=k.computePrefixFunction("abab"); for(int i=0;i<pai.length;i++) System.out.print(pai[i]); System.out.println(); } public KMP(String T,String p) { int[] pai=this.computePrefixFunction(p); int n=T.length(); int m=p.length(); int q=0; for(int i=0;i<n;i++) { while(q>0&&(p.charAt(q)!=T.charAt(i))) q=pai[q-1]; if(p.charAt(q)==T.charAt(i)) q++; if(q==(m-1)) { System.out.println("findit"); System.exit(0); } //q=pai[q]; } } public int[] computePrefixFunction(String p) { int len=p.length(); int pai[]=new int[len]; int k=0; for(int q=2;q<=len;q++) { while(k>0&&p.charAt(k+1-1)!=p.charAt(q-1)) { k=pai[k]; } if(p.charAt(k+1-1)==p.charAt(q-1)) k++; pai[q-1]=k; } return pai; } }
对于题目:在n个txt文档中找含有字符串“love”的文档。这个相对于上述KMP算法就简单的多了。该字符串中无重复字符,更不用提重复的前后缀了。在匹配的时候,指针扫描,如果出现不匹配现象,直接当前文档位置的字符从l开始匹配即可。查找时间为线性时间。
相关文章推荐
- 算法 字符串匹配算法(朴素模式及KMP模式) java实现
- KMP 字符串匹配算法
- kmp字符串匹配算法实现
- KMP字符串匹配算法
- 字符串匹配算法(KMP、BM和Sunday),及Python实现
- KMP字符串匹配算法
- 字符串匹配算法(BF和KMP)
- KMP字符串匹配算法
- KMP字符串匹配算法Java实现
- KMP字符串匹配算法
- 【算法题】字符串匹配算法KMP
- KMP字符串匹配算法
- kmp字符串匹配算法
- KMP字符串匹配算法
- [算法]字符串匹配算法KMP(java)
- 字符串匹配算法KMP
- 字符串匹配算法(KMP, BM, Sunday)
- 字符串匹配算法-KMP
- KMP字符串匹配算法(一)—模式字符串的匹配有限自动机
- java KMP 字符串匹配算法