Python ---- KMP(博文推荐+代码)
既解决完后宫问题(八皇后问题)后,又利用半天的时间完成了著名的“看毛片”算法——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(博文推荐+代码)的更多相关文章
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
- Python 学习书籍推荐
谁会成为AI 和大数据时代的第一开发语言? 这本已是一个不需要争论的问题.如果说三年前,Matlab.Scala.R.Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明 ...
- Python入门方法推荐,哪些基础知识必学?
很多想入门的小伙伴还不知道Python应该怎么学,哪些知识必学,今天我们就来盘点一下. 01.入门方法推荐 总体来讲,找一本靠谱的书,由浅入深,边看边练. 网上的学习教程有很多,多到不知道如何选择.所 ...
- Python 开发工具推荐
对于开发工具,仁者见仁智者见智,关键是自己喜欢,用着顺手就好,不用刻意去追求别人用的是什么工具. 这里给大家主要推荐三款工具,分别是PyCharm.Sublime Text 3.VS Code,因为这 ...
- python中执行javascript代码
python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext() ctxt.enter() ...
- python 人工智能资源推荐
原创 2017-06-05 玄魂工作室 玄魂工作室 我翻了翻我自己曾经看过的书,还是放弃了推荐.原因很简单,我对这个领域并不是很熟悉,我来推荐资源有点误人子弟.so,简单推点其他人建议给我的内容,希望 ...
- Python中文转拼音代码(支持全拼和首字母缩写)
本文的代码,从https://github.com/cleverdeng/pinyin.py升级得来,针对原文的代码,做了以下升级: 1 2 3 4 1.可以传入参数firstcode:如果为 ...
- 利用python实现电影推荐
"协同过滤"是推荐系统中的常用技术,按照分析维度的不同可实现"基于用户"和"基于产品"的推荐. 以下是利用python实现电影推荐的具体方法 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
随机推荐
- Android高仿UC浏览器和360手机卫士消息常驻栏(通知栏)
之前网上看了下自己定义消息栏,通知栏,了解到了Notification这个控件.发现UC浏览器等都是这样的类型,今天写个demo实现下.如图: 当中每一个button都有不同的功能.代码例如以下: p ...
- 设计模式之五:工厂方法模式(Factory Method)
工厂方法模式:定义了一个创建对象的接口,由子类来决定详细实例化那个对象.工厂方法模式让类的实例化转移到子类中来推断. Define an interface for creating an objec ...
- 3.1 The Interpolating Polynomial(站点)
Cubic Interpolation: https://www.youtube.com/watch? v=EtzlEA9MIwI Quad ...
- 全然卸载oracle11g步骤
iLife's 博客http://blog.csdn.net/fei1502816 全然卸载oracle11g步骤: 1. 開始->设置->控制面板->管理工具->服务 停止全 ...
- coffeescript遍历json对象
直接给代码: headers = a:"this is a" ,b:"this is b" ,c:"this is c" exheaders ...
- DIV+CSS在不同浏览器中的表现
在给员工培训DIV+CSS的过程中.他们向我提出了非常多问题,有些问题我自己也没有想到过于是抽了些时间自己进行了一番实验,所有实验在IE7和Firefox中进行: 实验一.假设一个div没有指定 ...
- Codeforces Beta Round #67 (Div. 2)C. Modified GCD
C. Modified GCD time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 【Poj1325】Machine Schedule机器调度
目录 List Description Input Output Sample Input Sample Output HINT Solution Code Position: http://poj. ...
- C# MySql 连接
1.将MySql.Data.dll引用到你的项目中 右键工程去完成. 2.using MySql.Data; using MySql.Data.MySqlClient; 3. MySqlConnec ...
- 如何看待B站疑似源码泄漏的问题?
今天突然看到关于B站源码泄漏事.网曝B站整个网站后台工程源码遭泄露,开源项目平台Github上疑似出现了Bilibili网站后台工程,内含部分用户名密码.目前官方还没对此事作出任何回应,所以还无法确定 ...