KPM算法初步理解

  一个字符串“FBCABCDABABCDABCDABYW”中是否包含另外一个字符串“ABCDABY”?

  上面这道题目是一个经典的字符串匹配的题目,对于字符串匹配,比较好的算法里很容易想到KPM算法,那KPM算法是干什么的?为什么说KPM比较优秀?

给定一个字符串O和F,长度分别是m、n,判断F是否在O中出现,如果出现则返回出现的位置。常规方法是遍历O的每一个字符,与F的每一个字符进行比较,但是这种方法的时间复杂度是T(m*n),但是KPM算法使得时间复杂度为T(m+n),谁优谁劣就不言而喻了。

关于其比较思想,我通过图解来说明下:

 (1)字符串”FBCABCDABABCDABCDABYW”的字符和”ABCDABY”的字符进行比较,如果不同就将”ABCDABY”往后移动一位,直到出现和”ABCDABY”首字符匹配的字符。

FBC ABCDAB ABCDABCDABYW

ABCDABY

FBC ABCDAB  ABCDABCDABYW

 ABCDABY

..........

FBC ABCDAB ABCDABCDABYW

ABCDABY

(2)哎呦,上面找到第字符相同的了,那接着顺序比较”ABCDABY”中下一个字符,直到出现和”FBCABCDABABCDABCDABYW”中不匹配的字符。

FBC ABCDAB ABCDABCDABYW

ABCDABY

............

FBC ABCDAB  ABCDABCDABYW

ABCDABY

(3)妈呀,又出现不匹配了,这时常规想法是将”ABCDABY”整体往后移动一位,然后在逐个比较,这样虽然也行,但是效率比较低,因为前面相同的字符串已经比较过了,再次比较是重复的东西。

KPM算法是此时移动位数 = 已经比较的字符数 - 除去最后一个不匹配字符中对应的部分匹配数,这个部分匹配是指F中已经比较的字符串”ABCDAB”中部分O中已经比较的“ABCDAB”重复的最大长度。那F中已经比较的”ABCDAB”字符数是6,O中和”ABCDAB”和F中”ABCDAB”部分重复的字符数是2(”AB”),那6-2=4,关于部分匹配解释如下:

  部分匹配数组的生成方法如下:

  先说两个名词:前缀和后缀。

  前缀:除去最后一个字符,一个字符串的全部组合。

  后缀:除去第一字符,一个字符串的全部组合。

  如“ABCDEABC”:

A的前缀后缀都是空,所以临时匹配是0;

AB的前缀是A,后缀是B,临时匹配是0;

ABC的前缀是A、AB,后缀是BC、B,其临时匹配是0;

ABCD的前缀是A、AB、ABC,后缀是BCD、CD、B,其临时匹配是0;

ABCDE前缀是A、AB、ABC、ABCD,后缀是BCDE、CDE、DE、E,其临时匹配是0;

ABCDEA前缀是A、AB、ABC、ABCD、ABCDE,其后缀是BCDEA、CDEA、DEA、EA、A,其

临时匹配是1(A);

ABCDEAB前缀是A、AB、ABC、ABCD、ABCDE、ABCDEA,后缀是BCDEAB、CDEAB、DEAB、EAB、AB、A,其临时匹配是2(AB);

ABCDEABC前缀是A、AB、ABC、ABCD、ABCDE、ABCDEA、ABCDEAB后缀是BCDEABC、CDEABC、DEABC、EABC、ABC、BC、C,其临时匹配是3(ABC)。

即移动到:

FBC ABCDAB ABCDABCDABYW

ABCDABY

(4)空格与C不匹配,那就还要继续往后移,这时已匹配的字符数为2("AB"),"部分匹配值"为0。所以,移动位数为 2,于是将搜索词向后移2位。

FBC ABCDAB ABCDABCDABYW

ABCDABY

(5)A和空格不匹配,继续往后移动一位。

FBC ABCDAB ABCDABCDABYW

ABCDABY

(6)逐个比较,找到上下不同的字符,发现Y和C不同,那按照(3)的算法,那移动位数是6-2=4.

FBC ABCDAB ABCDABCDABYW

ABCDABY

(7)最后还是逐个比较,完全匹配。此时发现F中还有一位没有比较,继续使用步骤(3)的算法,移动位数:7-0=7。

FBC ABCDAB ABCDABCDABYW

ABCDABY

(8)再次比较W和A,还是不匹配,往后移动一位,发现比较完了,完成搜索。

  以上是KPM算法的理解,关于这个算法的实现,将在下篇博客中记录,关于本文,欢迎吐槽............

原文地址:https://www.cnblogs.com/huiz/p/8525471.html

时间: 2024-08-29 06:44:28

KPM算法初步理解的相关文章

KMP算法初步理解

看了两天KMP算法,不知道理解的对不,初步理解总结如下:(主要是各种next数组把自己整晕了,有彻底懂的大神们再给指导下) 首先是思路,"字符串匹配的KMP算法_知识库_博客园"http://kb.cnblogs.com/page/176818/,问题的关键落在求数组上,而求数组实际是对自身求匹配度,所以求next数组的子函数和主函数很类似,所以网上讨论的好像主要是两种next数组,最好把相应的主函数列出来,还有像第二种的next和nextval数组都可用,在主函数相同的情况下,弥补一

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

openssl原理的初步理解与私有CA服务器的建立

加密算法主要分为对称加密算法和对称加密算法 一.对称加密算法的原理:使用相同的密钥进行加密运算的算法就是对称加密算法       加密过程(内容-->对称加密-->加密后的内容)       解密过程(加密内容-->对称加密方式-->解密后的内容)       优点与特点:速度块 加密相对安全 加密紧凑:缺点是不能用于大规模使用,会随参与人数的正佳而映像密钥的存储和管理,不支持数字签名和不可否认性   二.  非堆成加密的原理:非对称算法需要每个参与者产生一对密钥,且将公钥共享到服

POJ1523(求连用分量数目,tarjan算法原理理解)

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7406   Accepted: 3363 Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a

CSS (一)初步理解

通过牛腩新闻发布系统,接触了CSS,也感受到了它在做Web前台开发时简单方便易更改的优点. 尤其是后边对于CSS盒子的学习和认识,更加让人体会到网页设计和很多事物一样蕴含着深刻的思想和设计技巧,融于生活,表现生活. 本篇文章主要是对CSS内容概况的一些个人理解. CSS,即级联样式表.它真正做到了使网页表现层与内容分离的一种样式设计语言,做到了代码控制界面,简单易修改的解耦效果. 通过CSS,我们可以精确控制对象位置精确到像素级,还可以随心设计对象样式和风格,达到最优的美观度. 下面是CSS的一

CSS初步理解

最近在学习牛腩的时候遇到了网页的制作,挺新鲜的.当中涉及到了有关CSS的知识,于是乎自己也就花费两个小时的时间,找了本浅显易懂的书来看了一遍,从宏观上来了解CSS的相关内容.有关CSS的基础知识详见下链接. CSS基础知识 以下是对CSS理解的导图 通过上图我们也发现,CSS也很难,也容易.容易是说,学起来很快就可以上手,这中语言简单易懂,只要你具备小学英语的知识量就可以了.困难是在指学好它并不容易,因为它需要你耐心.就好比我们对word文档的排版,哪里需要主体鲜明一点,哪里需要着重突出一下,哪

Spring学习笔记--环境搭建和初步理解IOC

Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架. 下面介绍环境的搭建,首先下载好spring的完整包,我下载的是4.2.5版本的,在elipse中,新建java项目: 1,导入核心jar包: 2.在src目录下,创建spring配置文件(名称可以自定义,一般写为beans.xml): <?xml version="1.

01背包算法的理解

01背包问题: 有N件物品和一个最大重量限制为V的背包.第i件物品的重量是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的重量总和不超过V,且价值总和最大.每个物品只有1份,且不可分割 看了01背包算法,言简意赅,但理解起来头昏脑胀,不得要领.尝试解释下对该算法的理解,加深记忆. 假设最优解已经存在,怎么判断一个物品i是否在背包里?  简单,只要知道, 1.c[i]是否大于V, 2.F[i-1][V-c[i]],即没有i物品的情况下,最大重量限制为V-c[i]的最优解. 3.F[i

初步理解socket

近期研究下socket,发现自己还是有非常多不明确的地方,索性沉下心来,从最基础開始学习,開始看起,如今对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正. 原创文章,转载请注明出处:http://blog.csdn.net/jessonlv TCP/IP 在学习socket之前,先回想下TCP/IP协议. TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机怎样连入因特网及数据怎样再它们之间