字符串匹配过程中,如果使用蛮力算法,效率非常的差,在此介绍一种较为高效的匹配算法KMP算法。
其主要思想是从匹配的模版去分析,即去分析Pattern串的自身规律,进而去优化匹配的效率。例如字符串“ababcb”,明显看出是ab出现一组重复,若出现如下匹配模式:
text:abababcb
pattern: abab
cb
此时发生错误,一般情况下会选择移动Pattern一个位置来继续,事实证明效果不佳。聪明的人一眼就看出来,下一步应该进行这样的匹配
text:abababcb
pattern: ababcb
通过一次移动两个位置便迅速完成匹配,而移动的位置大小也恰恰是ab这个重复串的大小,所以,匹配每次移动的位置一定和当前字符串的真前缀真后缀有关,根据科学家实验,移动的位置==最大相等真前后缀的长度,此时我们需要一个和模版一样长的数组去存放Pattern下次要移动的位置,我们称Nexd[]。
对于Parrern:"a b a b c b" 这个模版来讲,
它的next[]: -1 0 0 1 2 0
其中数字next[i]代表下次模版需要用Pattern[next[i]]去匹配text,而-1代表整个模版直接跳过当前字符。所以,
算法的关键其实就是算出next[].
public class KMP
{
public KMP()
{
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String text = "ab abcb ababcb abab cb ababcb ababc ";
String pattern ="ababcb";
showList(getNext(pattern));
kmpScan(text, getNext(pattern), pattern);
}
public static void kmpScan(String str, int[] next,String pattern)
{
int k =0;
int j =0;
int count =0;
int index =0;
//int[] index = new int[count];
while(k<str.length())
{
if(j==-1&&k<str.length())
{
k++;
j=0;
}
else if(str.charAt(k)==pattern.charAt(j))
{
j++;
k++;
}
else{
j=next[j];
}
if(j==pattern.length())
{
index = k-j;
j=0;
k++;
count++;
System.out.println(index);//记录了字符出现的位置
}
}
System.out.println(count);
}
public static int[] getNext(String pattern)
{
char[] pat = pattern.toCharArray();
int[] next = new int[pattern.length()];
next[0]=-1;
next[1]=0;
for (int i = 2; i < next.length; i++)
{
int k=next[i-1];
while(k>=0)
{
if(pat[k]==pat[i-1])
break;
k=next[k];
}
next[i]=k+1;
}
return next;
}
public static void showList(int next[])
{
for (int i = 0; i < next.length; i++)
{
System.out.printf("%d ",next[i]);
}
System.out.println();
}
}
结果:
-1 0 0 1 2 0
8
23
2
结论:一种高效的算法,在英文匹配上比较出色,也可以将其用在byte匹配上~
另一种更高效的算法BM,期待下一篇~
分享到:
相关推荐
总结来说,KMP算法是一种高效的字符串匹配方法,它通过部分匹配表避免了不必要的回溯,提高了匹配效率。"DemoZwb"压缩包文件提供了一个实际的KMP算法实现,通过运行和分析这个程序,你可以进一步加深对KMP算法的理解...
这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。
《KMP算法详解——高效字符串匹配的秘密》 在信息技术领域,字符串处理是极其常见的操作,尤其是在文本分析、数据挖掘和模式识别中。其中,字符串匹配是核心问题之一,而KMP(Knuth-Morris-Pratt)算法正是解决这一...
字符串查找是计算机科学中一个基础且重要的问题,特别是在文本处理、模式匹配和数据搜索等领域...在实际编程中,可以使用各种编程语言实现KMP算法,例如C++、Java、Python等,通过调试和优化,可以进一步提高算法性能。
KMP算法实现,用Java语言实现的KMP字符串匹配算法
在实际应用中,KMP算法通常用C++、Java等编程语言实现,其时间复杂度为O(m+n),其中m是子串长度,n是主串长度,空间复杂度主要取决于部分匹配表的大小,也是O(m)。 KMP算法广泛应用于文本处理、数据分析等领域,如...
总结,KMP算法是一种高效的字符串搜索方法,通过构建部分匹配表避免了无效的回溯,大大提升了匹配效率。在Java编程中,我们可以通过清晰的逻辑结构和有效的数据结构来实现这一算法,使其在实际问题中发挥重要作用。...
Java KMP算法是一种高效的字符串匹配算法,主要用于在主串(目标字符串)中查找子串(模式字符串)的位置。它的全称是Knuth-Morris-Pratt算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年代提出。KMP算法避免了...
在实际编程实现中,KMP算法通常用C++、Java、Python等编程语言实现,通过对字符串进行迭代和条件判断,结合部分匹配表来完成高效的模式匹配。在本压缩包文件中,可能包含了用某种编程语言封装好的KMP算法实现,可供...
Java实现的KMP(Knuth-Morris-Pratt)...综上所述,Java实现的KMP算法是一种优化的字符串匹配算法,通过部分匹配表减少不必要的比较,提高了搜索效率。理解并掌握这一算法对于解决涉及到字符串匹配的问题非常有帮助。
本文档为使用Java代码实现了: 1.朴素的字符串匹配算法; 2.KMP字符串模式匹配算法 详细说明请参见博客: http://blog.csdn.net/lemon_tree12138/article/details/48488813
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt三位学者提出,因此也被称为克努特-莫里斯-普拉特操作(简称KMP算法)。以下是对KMP算法的详细介绍: 一、算法基础与目的 KMP算法是基于...
KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法。它的主要思想是在发生不匹配时,能知道部分已经匹配的字符序列的后缀和模式串的前缀存在重复,因此可以利用这些信息避免...
本项目提供的"字符串匹配演示程序"涵盖了四种经典的算法:平凡算法、KMP算法、Boyer-Moore(BM)算法以及Rabin-Karp(RK)算法。下面将详细介绍这四种算法及其工作原理。 1. **平凡算法**: 平凡算法是最直观的...
KMP算法的Java实现 public class KMP { public static int[] next; static void GetNext(String p,int next[]) { int pLen = p.length(); next[0] = -1;
为了优化性能,更复杂的字符串匹配算法如KMP(Knuth-Morris-Pratt)、Boyer-Moore、Rabin-Karp等可以被采用,尤其是在处理大量数据时。不过,这些高级算法通常用于在字符串中查找子串,而非简单的等价比较。 总的来...
KMP(Knuth-Morris-Pratt)算法是...总的来说,KMP算法提供了一种高效的字符串匹配方法,通过部分匹配表优化了搜索过程,减少了比较次数。在Java中实现KMP算法,需要理解其核心思想,并熟练运用这部分知识来编写代码。
提供的"模式匹配KMP算法实验报告.docx"文件,可能是对KMP算法的详细解释和实际应用示例,包括算法的理论介绍、代码实现、性能分析和可能的优化方法。阅读这份报告可以帮助读者深入理解KMP算法,并提供实践操作的...
字符串匹配算法的演示程序,包括了平凡算法、KMP、RK、BM四种,有界面,统计展示移动和比较次数等信息。