字符串匹配的KMP算法详解及C#实现
2013-08-09 11:38
429 查看
字符串匹配是计算机的基本任务之一。
举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。
这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。
1.
View Code
这种实现比我上面的实现,性能要高出三倍,原因在与,它生成“Next特征数组”(网上有资料这么叫的)只用了一个循环,而我的用了三个循环,貌似最后那个数组值也不一样,没看懂他的思路是怎么回事,如有懂的,请指点下,谢谢!测试代码下载:http://files.cnblogs.com/joey0210/ArithmeticSolution.rar
举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。
这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。
1.
private static int KmpIndexOf(string s, string t) { int i = 0, j = 0, v; int[] nextVal = GetNextVal(t); while (i < s.Length && j < t.Length) { if (j == -1 || s[i] == t[j]) { i++; j++; } else { j = nextVal[j]; } } if (j >= t.Length) v = i - t.Length; else v = -1; return v; } private static int[] GetNextVal(string t) { int j = 0, k = -1; int[] nextVal = new int[t.Length]; nextVal[0] = -1; while (j < t.Length - 1) { if (k == -1 || t[j] == t[k]) { j++; k++; if (t[j] != t[k]) { nextVal[j] = k; } else { nextVal[j] = nextVal[k]; } } else { k = nextVal[k]; } } return nextVal; }
View Code
这种实现比我上面的实现,性能要高出三倍,原因在与,它生成“Next特征数组”(网上有资料这么叫的)只用了一个循环,而我的用了三个循环,貌似最后那个数组值也不一样,没看懂他的思路是怎么回事,如有懂的,请指点下,谢谢!测试代码下载:http://files.cnblogs.com/joey0210/ArithmeticSolution.rar
相关文章推荐
- 字符串匹配的KMP算法详解及C#实现
- 字符串匹配的Boyer-Moore算法 详解 加 C# 实现
- kmp算法实现字符串匹配
- 字符串匹配的KMP算法--前缀和后缀的详解
- C++实现字符串匹配的KMP算法
- 字符串匹配(java)实现,普通的匹配和KMP算法 (参考)
- 字符串匹配的KMP算法实现
- 字符串匹配KMP算法C++代码实现
- C语言实现字符串匹配KMP算法
- 字符串匹配KMP算法的C语言实现
- 字符串匹配——KMP算法的Java实现
- kmp算法实现的字符串匹配
- 字符串匹配KMP算法实现
- 字符串匹配:KMP算法的实现以及理解
- 字符串匹配的KMP算法和朴素算法,及其python实现
- Leetcode28. kmp算法实现字符串匹配
- 字符串匹配KMP算法详解
- 字符串匹配KMP算法详解
- 字符串匹配之KMP算法思路、原理与Java实现
- 字符串匹配问题——求给定字符串的next数组以及KMP算法实现