`
wh137795233
  • 浏览: 7008 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

字符串匹配 KMP 算法 Java实现

阅读更多
字符串匹配过程中,如果使用蛮力算法,效率非常的差,在此介绍一种较为高效的匹配算法KMP算法。
其主要思想是从匹配的模版去分析,即去分析Pattern串的自身规律,进而去优化匹配的效率。例如字符串“ababcb”,明显看出是ab出现一组重复,若出现如下匹配模式:
        text:abababcb
     pattern: ababcb
此时发生错误,一般情况下会选择移动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,期待下一篇~
0
0
分享到:
评论

相关推荐

    传统字符串匹配以及kmp算法匹配,包含kmp 导出的Archive file 文件修改jdk可以直接运行

    总结来说,KMP算法是一种高效的字符串匹配方法,它通过部分匹配表避免了不必要的回溯,提高了匹配效率。"DemoZwb"压缩包文件提供了一个实际的KMP算法实现,通过运行和分析这个程序,你可以进一步加深对KMP算法的理解...

    字符串 模式匹配 kmp算法 java实现

    这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。

    KMP.rar_KMP_KMP算法_串 KMP算法_字符串匹配

    《KMP算法详解——高效字符串匹配的秘密》 在信息技术领域,字符串处理是极其常见的操作,尤其是在文本分析、数据挖掘和模式识别中。其中,字符串匹配是核心问题之一,而KMP(Knuth-Morris-Pratt)算法正是解决这一...

    字符串查找KMP算法

    字符串查找是计算机科学中一个基础且重要的问题,特别是在文本处理、模式匹配和数据搜索等领域...在实际编程中,可以使用各种编程语言实现KMP算法,例如C++、Java、Python等,通过调试和优化,可以进一步提高算法性能。

    KMP算法Java实现

    KMP算法实现,用Java语言实现的KMP字符串匹配算法

    kmp字符串查找算法

    在实际应用中,KMP算法通常用C++、Java等编程语言实现,其时间复杂度为O(m+n),其中m是子串长度,n是主串长度,空间复杂度主要取决于部分匹配表的大小,也是O(m)。 KMP算法广泛应用于文本处理、数据分析等领域,如...

    kmp算法-基于Java实现kmp字符串搜索算法.zip

    总结,KMP算法是一种高效的字符串搜索方法,通过构建部分匹配表避免了无效的回溯,大大提升了匹配效率。在Java编程中,我们可以通过清晰的逻辑结构和有效的数据结构来实现这一算法,使其在实际问题中发挥重要作用。...

    java_kmp_algorith.rar_字符串匹配

    Java KMP算法是一种高效的字符串匹配算法,主要用于在主串(目标字符串)中查找子串(模式字符串)的位置。它的全称是Knuth-Morris-Pratt算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年代提出。KMP算法避免了...

    kmp模式匹配算法

    在实际编程实现中,KMP算法通常用C++、Java、Python等编程语言实现,通过对字符串进行迭代和条件判断,结合部分匹配表来完成高效的模式匹配。在本压缩包文件中,可能包含了用某种编程语言封装好的KMP算法实现,可供...

    java实现KMP算法

    Java实现的KMP(Knuth-Morris-Pratt)...综上所述,Java实现的KMP算法是一种优化的字符串匹配算法,通过部分匹配表减少不必要的比较,提高了搜索效率。理解并掌握这一算法对于解决涉及到字符串匹配的问题非常有帮助。

    模式匹配之KMP算法(Java版)

    本文档为使用Java代码实现了: 1.朴素的字符串匹配算法; 2.KMP字符串模式匹配算法 详细说明请参见博客: http://blog.csdn.net/lemon_tree12138/article/details/48488813

    KMP算法是一种改进的字符串匹配算法.docx

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt三位学者提出,因此也被称为克努特-莫里斯-普拉特操作(简称KMP算法)。以下是对KMP算法的详细介绍: 一、算法基础与目的 KMP算法是基于...

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法。它的主要思想是在发生不匹配时,能知道部分已经匹配的字符序列的后缀和模式串的前缀存在重复,因此可以利用这些信息避免...

    字符串匹配演示程序(平凡、KMP、BM、RK)

    本项目提供的"字符串匹配演示程序"涵盖了四种经典的算法:平凡算法、KMP算法、Boyer-Moore(BM)算法以及Rabin-Karp(RK)算法。下面将详细介绍这四种算法及其工作原理。 1. **平凡算法**: 平凡算法是最直观的...

    KMP算法的Java实现(数据结构)

    KMP算法的Java实现 public class KMP { public static int[] next; static void GetNext(String p,int next[]) { int pLen = p.length(); next[0] = -1;

    char_comp.rar_字符串匹配_字符串匹配comp

    为了优化性能,更复杂的字符串匹配算法如KMP(Knuth-Morris-Pratt)、Boyer-Moore、Rabin-Karp等可以被采用,尤其是在处理大量数据时。不过,这些高级算法通常用于在字符串中查找子串,而非简单的等价比较。 总的来...

    kmp算法的Java实现.zip

    KMP(Knuth-Morris-Pratt)算法是...总的来说,KMP算法提供了一种高效的字符串匹配方法,通过部分匹配表优化了搜索过程,减少了比较次数。在Java中实现KMP算法,需要理解其核心思想,并熟练运用这部分知识来编写代码。

    KMP.rar_KMP算法_java KMP_kmp string_kmp string tutorial_算法

    提供的"模式匹配KMP算法实验报告.docx"文件,可能是对KMP算法的详细解释和实际应用示例,包括算法的理论介绍、代码实现、性能分析和可能的优化方法。阅读这份报告可以帮助读者深入理解KMP算法,并提供实践操作的...

    字符串匹配算法演示程序

    字符串匹配算法的演示程序,包括了平凡算法、KMP、RK、BM四种,有界面,统计展示移动和比较次数等信息。

Global site tag (gtag.js) - Google Analytics