既解决完后宫问题(八皇后问题)后,又利用半天的时间完成了著名的“看毛片”算法——KMP。对于初学者来说这绝对是个大坑,非常难以理解。

在此,向提出KMP算法的三位大佬表示诚挚的敬意。!!!牛X!!!

首先,先介绍一下什么是KMP算法:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。[1]    

In a word: !!!敲黑板!!!, 在进行字符串匹配时,有普通群众思维和学霸青年思维

普通群众思维就是暴力破解,即将主串中所有与模式串长度一致的连续子串与模式串比较,这个过程中,主串索引会存在回退的过程,大大拉低效率。

学霸青年思维就是KMP匹配,在匹配时,主串索引一直是向前,不退后,只改变模式串的索引,这样匹配效率就大大提高了。


在KMP算法里,主要有两大问题需要理解:   KMP原理    和    next数组计算 ,接下来会在对这两部分尽量进行解释一下。

KMP原理

首先我先放一篇我认为的比较好的博文资料,作为小白的我,也是看着博文一点一点慢慢学习的。http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

这篇博文我觉得对于初学者而言,足以理解KMP的原理了。其核心思想即为:,

在主串与模式串中各存在一个比较指针,指针所指的地方即为程序比较的地方,利用对模式串的信息的充分掌握,使其在与主串匹配的时候,灵活改变比较指针,使主串的比较指针一直向前,绝不退后。

用盗墓笔记中的一句话概括即为,"小三爷你大胆的往前走啊,往前走,莫回呀头"。

在这其中,最关键的就是在匹配的过程中,如何移动其比较指针的位置? 这就是大名鼎鼎的next数组。

Next数组

看了网上那么多的解释,我觉得这一个版本的解释最好懂,真是豁朗开朗http://www.cnblogs.com/tangzhengyue/p/4315393.html,由于自身水平有限,所以这里就不多说什么了,我怕越说越糊涂。关键就是计算模式串中每个字母

最长前后缀匹配。前后缀的解释在介绍KMP原理的那篇博文里已经写的非常清楚了。

下面就直接上代码吧,这样来的比较直接。

代码

def getNext(t):
j, i = -1, 0
next = [-1]*len(t)
while i < len(t)-1:
if -1 == j or t[i] == t[j]:
i, j = i + 1, j + 1
next[i] = j
else:
j = next[j]
return next def KMP(s,t):
next = getNext(t)
j, i = -1, -1
while j != len(t) and i < len(s):
if s[i] == t[j] or j == -1:
i, j = i + 1, j + 1
else:
j = next[j]
return (i-j,True) if j == len(t) else "None" print(KMP("ababxbabcdabdfdsss","abx"))

本来试着去解释一下程序,可是发现真的很难解释,next数组的求解程序中最关键的是如何初始化。KMP程序就相对比较好理解了。

好吧,最好的方法就是将代码放在IDE中单步调试,的每执行一部查看变量的情况,这样结合原理理解的最快。

[1]. 摘自百度百科KMP词条

Python ---- KMP(博文推荐+代码)的更多相关文章

  1. 博文推荐】Javascript中bind、call、apply函数用法

    [博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...

  2. Python 学习书籍推荐

    谁会成为AI 和大数据时代的第一开发语言? 这本已是一个不需要争论的问题.如果说三年前,Matlab.Scala.R.Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明 ...

  3. Python入门方法推荐,哪些基础知识必学?

    很多想入门的小伙伴还不知道Python应该怎么学,哪些知识必学,今天我们就来盘点一下. 01.入门方法推荐 总体来讲,找一本靠谱的书,由浅入深,边看边练. 网上的学习教程有很多,多到不知道如何选择.所 ...

  4. Python 开发工具推荐

    对于开发工具,仁者见仁智者见智,关键是自己喜欢,用着顺手就好,不用刻意去追求别人用的是什么工具. 这里给大家主要推荐三款工具,分别是PyCharm.Sublime Text 3.VS Code,因为这 ...

  5. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  6. python 人工智能资源推荐

    原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...

  7. Python中文转拼音代码(支持全拼和首字母缩写)

    本文的代码,从https://github.com/cleverdeng/pinyin.py升级得来,针对原文的代码,做了以下升级:     1 2 3 4 1.可以传入参数firstcode:如果为 ...

  8. 利用python实现电影推荐

    "协同过滤"是推荐系统中的常用技术,按照分析维度的不同可实现"基于用户"和"基于产品"的推荐. 以下是利用python实现电影推荐的具体方法 ...

  9. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

随机推荐

  1. [转] CV Datasets on the web

    转自:CVPapers This material is presented to ensure timely dissemination of scholarly and technical wor ...

  2. 具体解释kernel中watchdog 驱动程序

    watchdog不管在小系统还是大的project系统中都是必须存在的.在解决线程挂死.系统死循环等都用非常重要的应用,算是系统出问题恢复初始状态的救命稻草. 在kernel中wdt的应用不是非经常见 ...

  3. css高级:font-size

    body{ font:62.5%/1.6em "Lucida Grande",Verdana,Geneva,Helvetica,Arial,sansserif; }//font-s ...

  4. Qt Quick综合实例之文件查看器

    假设你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以Applicat ...

  5. 微软将支持.net开源并跨平台,新特性会体现于VS2015

    http://news.microsoft.com/2014/11/12/microsoft-takes-net-open-source-and-cross-platform-adds-new-dev ...

  6. P1830 轰炸III

    P1830 轰炸III 84通过 145提交 题目提供者wanglichao1121 标签模拟矩阵洛谷原创 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 一个大小为N ...

  7. oc85--利用宏定义简化单例

    //Singleton.h // 以后就可以使用interfaceSingleton来替代后面的方法声明. \表示下一行也是上一行的内容. #define interfaceSingleton(nam ...

  8. codevs3728联合权值(LCA)

    3728 联合权值  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 输入描述 Input Des ...

  9. POJ3070Fibonacci

    矩阵乘法裸题 求快速幂 #include<iostream> #include<cstdio> #define ll long long #define Mod 10000 u ...

  10. Django day27 认证组件,权限组件()

    一:认证组件 1.写一个类 class LoginAuth(): # 函数名一定要叫authenticate,接收必须两个参数,第二个参数是request对象 def authenticate(sel ...