`
ftj20003
  • 浏览: 132093 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

KMP算法的简单实现

    博客分类:
  • Java
阅读更多
      一直把精力放在web应用的开发和框架学习,应用,架构的领悟等等这些几乎见不到算法存在的场景中,对算法这个‘内功’修炼一直有种没处下牙的尴尬境地。不过这不代表从此不再接触算法,一味的只去掌握JDK封装好的API库。今天使用String的indexOf(...)的时候突然想看看这个方法的实现,于是...
      1.6.0.17的算法实现主要代码:
     
for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j] ==
                         target[k]; j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;

这个算法还是使用了简单匹配,首先找到第一个匹配的字符,然后在当前之后创建新的指针指向第二个字符,然后匹配剩余的。这个算法其实相当于i指针在匹配到不相等的时候回缩指针。所以时间复杂度是两串长度之积。不知是不是觉得不会有较长的字符串的匹配,所以不去优化,还是我把算法理解错了,呵呵。
      既然我觉得这个算法不怎么好,对于较长字符串的匹配效率不怎么样,那就不得不看数据结构中被大加赞赏的KMP模式匹配算法了。具体的算法原理就不弄斧了,优秀的牛人们早就在网上留下了过分多的优秀讲解。我这里把我理解原理后的Java实现代码分享一下:
public class KmpTest {

	/**The Next() function of The KMP algorithm.
	 * @param chars
	 * @return
	 */
	private int[] createNext(char[] chars) {
		int len = chars.length;
		int[] nextArr = new int[len];
		int i = 0, j = -1;
		while (i < len - 1) {
			if ((j == -1) || (chars[j] == chars[i])) {
				i++;
				j++;
				if (chars[j] != chars[i]) {
					nextArr[i] = j + 1;
				} else {
					nextArr[i] = nextArr[j];
				}
			} else {
				j = nextArr[j] - 1;
			}
		}
		return nextArr;
	}

	/**The default method which can find the index of a pattern String in a specific String.
	 * Pattern from the first character of the specific String.
	 * @param str
	 * @param pattern
	 * @return
	 */
	public int kmpIndex(String str, String pattern) {
		return kmpIndex(str, pattern, 0);
	}

	/**Pattern from a specific postion of the specific String.
	 * @param str
	 * @param pattern
	 * @param pos
	 * @return
	 */
	public int kmpIndex(String str, String pattern, int pos) {
		char[] strChars = str.toCharArray();
		char[] ptenChars = pattern.toCharArray();
		int len = strChars.length;
		int[] next = createNext(ptenChars);
		int i = pos - 1, j = -1;
		while (i < len && j < next.length) {
			if ((j == -1) || (strChars[i] == ptenChars[j])) {
				i++;
				j++;
			} else {
				j = next[j] - 1;
			}
		}
		if (j > next.length - 1) {
			return i - next.length;
		} else {
			return -1;
		}
	}

}


再有就是一个简单的test case.

import junit.framework.Assert;
import junit.framework.TestCase;

public class KmpTestCase extends TestCase {

	KmpTest kmpTest;

	@Override
	protected void setUp() throws Exception {
		kmpTest = new KmpTest();
	}

	public void testKmpIndex() {
		Assert.assertEquals(0, kmpTest.kmpIndex("ababaababc", "ababa"));
		Assert.assertEquals(2, kmpTest.kmpIndex("ababaababc", "abaab"));
		Assert.assertEquals(6, kmpTest.kmpIndex("ababaababc", "babc"));
		Assert.assertEquals(-1, kmpTest.kmpIndex("ababaababc", "baabc"));

		Assert.assertEquals(2, kmpTest.kmpIndex("ababaababc", "abaa", 2));
		Assert.assertEquals(-1, kmpTest.kmpIndex("ababaababc", "abaa", 3));
	}

}


算法这门功夫是一个程序员维持程序生命的根源或者说内功,虽然对我来说,练就基本功都需要很大的精力,我想我还是会在日常的工作学习中勤加练习的。
0
0
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    KMP算法的实现

    KMP算法的实现, 这程序代码是基于KMP算法来实现的,虽然很简单,但是可能也会对你有帮助的

    数据结构课程设计实验报告-KMP算法的实现

    相比于简单的暴力匹配方法,KMP算法避免了不必要的回溯,极大地优化了搜索过程。 在KMP算法中,关键在于构建一个“部分匹配表”或称为“next数组”。这个表记录了模式串中每个位置上的字符与前面字符构成的最长公共...

    简单kmp算法实现

    简单的kmp算法实现,代码结构十分清晰,适合初学者理解kmp算法

    数据结果 kmp算法实验报告

    1. **比较Brute-Force算法和KMP算法的比较次数**:编写程序实现这两种算法,并统计它们在处理相同输入时的比较次数,从而直观地比较两者的效率差异。 2. **实现串的替换功能**:编写函数`Replace(S, start, T, V)`,...

    模式匹配的KMP算法

    * 算法简单、易于实现 模式匹配的KMP算法的应用领域包括: * 文本编辑程序 * 信息检索系统 * 字符串处理 * 语言翻译系统 * 等等 模式匹配的KMP算法是一种高效、可靠的串模式匹配算法,具有广泛的应用前景。本课程...

    BF算法和KMP算法

    BF 算法简单易实现,但时间复杂度较高;KMP 算法效率更高,但实现起来相对复杂。因此,在选择字符串匹配算法时,需要根据实际情况进行选择。 BF 算法和 KMP 算法都是字符串匹配中常用的算法,但它们的时间复杂度和...

    KMP算法 C#简单实现

    在C#中实现KMP算法,可以有效地处理字符串匹配问题,避免了不必要的回溯,提高了效率。下面我们将详细探讨KMP算法的基本原理、C#实现以及应用。 ### KMP算法原理 1. **部分匹配表**:KMP算法的核心是构建一个部分...

    KMP算法实现的C++代码

    以下是一个简单的KMP算法C++实现: ```cpp #include #include std::vector&lt;int&gt; computePrefixFunction(const std::string& pattern) { int m = pattern.size(); std::vector&lt;int&gt; pi(m); for (int i = 1, j ...

    KMP算法的C语言实现

    以下是一个简单的C语言实现KMP算法的代码框架: ```c #include #include // 构建前缀表 void computePrefixTable(char* pattern, int prefixTable[]) { // 省略具体实现 } // KMP算法 int KMP(char* text, ...

    KMP算法的实现简单示例

    KMP算法的关键在于next()函数的实现。next()函数存储了模式串的“部分匹配”信息。next()函数的具体实现如下:1. 当模式串的第j个字符与主串的第i个字符相等时,next[j] = next[j-1];2. 当模式串的第j个字符与主串...

    KMP算法的介绍以及实现

    2. **快速定位**:通过next数组,KMP算法能够在出现失配时快速定位到下一个可能的匹配起点,而不是简单地移动模式串。 #### 三、KMP算法的具体实现 下面详细介绍KMP算法的实现过程,包括next数组的构建和模式匹配...

    数据结构KMP算法

    KMP算法的实现主要基于部分匹配表(Partial Match Table,也称为失配表),它记录了模式串中每个字符前缀和后缀的最大公共长度。当模式串在文本串中比较时遇到不匹配的情况,算法会根据失配表来决定下一次比较时模式...

    KMP算法~~完整的

    相比于简单的模式匹配算法,KMP算法能够显著提高搜索速度,尤其是在处理大规模文本数据时优势明显。本文将详细介绍KMP算法的工作原理、优势以及其实现细节。 #### 简单匹配算法 在讨论KMP算法之前,我们首先回顾...

    KMP算法,及在内核的实现

    《KMP算法及其在内核实现的深度剖析》 KMP(Knuth-Morris-Pratt)算法,是由Donald Knuth、Vaughan Pratt和James H. Morris三位学者于1970年代提出的一种字符串匹配算法。这个算法以其高效性和避免了不必要的字符...

    KMP算法详解KMP算法详解

    KMP 算法的时间复杂度为 O(m+n),远远优于简单匹配算法的时间复杂度 O(m*n)。在实际应用中,KMP 算法常用于文本搜索、模式识别等领域。 模式函数值 模式函数值是 KMP 算法中非常重要的一个概念。模式函数值表示...

    kmp算法详解

    "kmp算法详解" KMP 字符串模式匹配算法是高效的字符串匹配算法,时间复杂度为 O(m+n),其中 m 和 n 分别是主串和模式串的长度。KMP 算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。 KMP 算法的...

    kmp算法详解及练习

    KMP算法的核心在于避免了传统字符串匹配算法中出现的不必要的回溯操作,即当模式串的一部分与主串匹配失败时,能够快速确定下一步应该从模式串的哪个位置开始继续匹配,而不是简单地回退到之前的匹配位置重新开始...

    kmp算法-基于C语言实现KMP算法.zip

    以下是一个简单的C语言实现KMP算法的示例: ```c #include #include // 构建部分匹配表 void compute_Pi(char* pattern, int* pi, int m) { int i = 1, j = 0; pi[0] = 0; while (i ) { if (pattern[i] == ...

    KMP算法C++实现.pptx

    **KMP算法简介** KMP(Knuth-Morris-Pratt)...综上所述,KMP算法是字符串匹配领域的一个重要工具,具有高效、简单等优点,尤其在处理大规模数据时效果显著。通过合理的优化,KMP算法能在C++环境中发挥更大的效能。

Global site tag (gtag.js) - Google Analytics