前言

虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于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》

主要思想参考这里:

字符串匹配的KMP算法(阮一峰)

主要实现参考这里:

http://blog.csdn.net/yearn520/article/details/6729426

http://biaobiaoqi.me/blog/2013/05/25/kmp-algorithm/

笨拙的大脑

我和很多普通人一样,对于此类问题,大脑中的第一反应时朴素暴力匹配法

  • 假设T从i处开始迭代索引
  • 比较失配时,使用回溯法,将P相对于T右移1位,然后T的迭代索引回溯到i+1,重新匹配
  • 缺陷:重复的移动操作,重复的比较匹配操作
  • 效率:移动操作为(n-m),比较操作为m,数量级O(n*m)

优化的KMP

KMP的核心思想是,利用模式串进行自我匹配,生成前缀数组,优化移动和匹配操作

  • 目标串无须回溯,只需要移动模式串即可,节省移动操作
  • 重复的匹配可以省略,节省了匹配操作,大概列两种极端的例子
  • 额外的空间开销O(m)(存储nexts数组),线性时间开销 O(n+m)

难点

算法的关键和难点在于计算前缀数组next[]

实现

  • 前缀数组next实现
static void SetPrefix(IList<char> pattern, int[] nexts)
{
nexts[0] = 0;
int m = pattern.Count;
for (int i = 1; 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;
}
}
  • KMP匹配方法实现
static IEnumerable<int> KMP(string text, string pattern)
{
int[] nexts = new int[pattern.Length]; int n = text.Length;
int m = pattern.Length; SetPrefix(pattern.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的改进实现也有很多,时间和精力有限,以后有时间再深入!

KMP算法简单回顾的更多相关文章

  1. KMP 算法简单解释

    ​ 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 ​ 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...

  2. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  3. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  4. 简单kmp算法(poj3461)

    题目简述: 给你两个字符串p和s,求出p在s中出现的次数. 思路简述: 在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了.此题 ...

  5. KMP算法实践与简单分析

    一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...

  6. 运用kmp算法解决的一些问题的简单题解

    学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...

  7. KMP算法的一个简单实现

    今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...

  8. KMP算法 C#实现 字符串查找简单实现

    KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...

  9. Linux GCC下strstr的实现以及一个简单的Kmp算法的接口

    今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { con ...

随机推荐

  1. .net卸载程序制作

    原文:.net卸载程序制作 方法一: 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到). 在文件系统视图中选择应用程序文件,在msiexec ...

  2. 网站的SEO以及它和站长工具的之间秘密(转)

    博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...

  3. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  4. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)

    原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版) 很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个e ...

  5. C++ - new与malloc的差别

    malloc是C++语言的标准库函数:而new是C++语言中的操作符. new返回指定类型的指针,而且能够自己主动计算所需空间的大小:而malloc必需要由用户自己计算所需空间大小,并在返回后强行转换 ...

  6. Swiftly语言学习1

    单纯值: 1.let常量声明,var声明变量(同时宣布福值,编译器会自己主动判断出类型) var myVariable = 42 myVariable 50 let myConstant = 42 l ...

  7. 使用CNN(convolutional neural nets)关键的一点是检测到的面部教程(四):学习率,学习潜能,dropout

    第七部分 让 学习率 和 学习潜能 随时间的变化 光训练就花了一个小时的时间.等结果并非一个令人心情愉快的事情.这一部分.我们将讨论将两个技巧结合让网络训练的更快! 直觉上的解决的方法是,開始训练时取 ...

  8. linux_删除空文件(大小等于0的文件)的方法

    1: 查看 find . -name "*" -type f -size 0c 2:删除 find . -name "*" -type f -size 0c | ...

  9. 【Android UI设计和开发】动画(Animation)详细说明(一)

    Android开发之动画效果浅析 请尊重他人的劳动成果.转载请注明出处:Android开发之动画效果浅析 程序执行效果图: Android动画主要包括补间动画(Tween)View Animation ...

  10. Struts2.0+Spring3+Hibernate3(SSH~Demo)

    Struts2.0+Spring3+Hibernate3(SSH~Demo) 前言:整理一些集成框架,发现网上都是一些半成品,都是共享一部分出来(确实让人很纠结),这是整理了一份SSH的测试案例,完全 ...