您的位置:首页 > 其它

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代码实现如下所示

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开始匹配即可。查找时间为线性时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: