标签:style blog http color ar 使用 for sp art
虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴。我在自娱自乐,路过的朋友别太认真,嘿
目标串: T(1…..n)
模式串: P(1…..m)
输出:搜索P在T中的位置 s,令 T(s…s+m-1) === P(1…m)
例如:
a g c t a g c a g c t a g c t g中查找a g c t g 返回 12(从1计数)
资料太多了,我在此不准备进行深入分析整个推算过程,所以本篇文章只写给自己看
E文好理解能力好的直接去看原篇论文《Fast Pattern Matching in Strings》
主要思想参考这里:
主要实现参考这里:
http://blog.csdn.net/yearn520/article/details/6729426
http://biaobiaoqi.me/blog/2013/05/25/kmp-algorithm/
我和很多普通人一样,对于此类问题,大脑中的第一反应时朴素暴力匹配法
KMP的核心思想是,利用模式串进行自我匹配,生成前缀数组,优化移动和匹配操作
算法的关键和难点在于计算前缀数组next[]
static void SetPrefix(IList<char> pattern, int[] nexts) { nexts[0] = 0; int m = pattern.Count; for (int i = 0; i < m; i++) { int k = nexts[i - 1]; while (pattern[i] != pattern[k] && k != 0) { k = nexts[k - 1]; } if (pattern[i] == pattern[k]) nexts[i] = k + 1; else nexts[i] = 0; } }
static IEnumerable<int> KMP(string text, string pattern) { int[] nexts = new int[pattern.Length]; int n = text.Length; int m = pattern.Length; SetPrefix(text.ToList(), nexts); for (int i = 0, j = 0; i < n; i++) { while (j > 0 && text[i] != pattern[j]) j = nexts[j - 1]; if (text[i] == pattern[j]) j++; if (j == m) yield return i - m + 1; } yield break; }
关于串匹配的算法还有很多,关于KMP的改进实现也有很多,时间和精力有限,以后有时间再深入!
标签:style blog http color ar 使用 for sp art
原文地址:http://www.cnblogs.com/fecktty2013/p/algorithm-kmp-1.html