[算法之美] KMP算法的直观理解

  KMP算法是解决字符串匹配问题的,简单说来,其实就是问“P串(Pattern串)是不是T串(Text串)的子串,如果是的话就回答子串在P中的起始位置(即Index函数的返回值)”。

  穷举的算法是摆好T串并固定,然后手拿着P串一个一个比对。(我们假设i是指向T串的,j是指向P串的)

  现在我们拿着P串,看它的第1个字符和T串的第1个字符是不是相同的,是的话就看它的第2个字符和T串的第2个字符是不是相同的……不是的话就把P串右移一格,然后{

    看P串的第1个和T串的第2个是不是相同的,是的话就看它的第2个和T串的第3个是不是相同的……不是相同的话就把P串右移一格,然后

    看P串的第一个和T串的第二个是不是相同的,是的话就看它的第二个和T串的第三个是不是相同的……不是相同的话就把P串右移一格,循环往复。

    直到P串的最后一个字符也和T串相同时结束,此时(i-P串长度)就是子串在P中的起始位置。

  而这种方法效率是很低的,主要是每次一有不匹配的情况就只能右移1格然后从P串的第一个开始重新比较。

  KMP就是为了解决这样低效率的问题的。我们看这样一个例子:

        T串是:ababaab

        P串是:ababc

  

时间: 2024-12-09 22:46:58

[算法之美] KMP算法的直观理解的相关文章

【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

KMP算法及拓展KMP算法

KMP算法用于字符串匹配问题 原有一个主串T和一个要匹配字符串S 对S求next熟组然后进行较少回溯匹配 求next数组.也就是在S串匹配不正确时 进行回溯. 每个next数组指向前一个应该回溯对下标 然后进行匹配  对于每个不匹配字符串重新依据next数组匹配 原文地址:https://www.cnblogs.com/AAAzhuo/p/11764111.html

从零理解的KMP算法

KMP算法的优势 KMP算法是一个效率很高的字符串匹配算法,算法大意是:给定两个字符串y,x,判断x是否在y出现过.如果暴力搜索的话复杂度为O(lenx*leny),但用KMP算法解决的话, 我们只需要一个O(lenx)的预处理,优化暴力的复杂度变成O(lenx+leny),这里lenx,leny都代表字符串的长度. KMP算法的匹配方法 给定一个y为:ababacddsdfwwrababsababa 给定一个x为:ababa 我们先用暴力的方法跑一遍 1. ababacddsdfwwrabab

字符串匹配KMP算法的理解(详细)

1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. 然近期因开了个算法班,班上专门讲解数据结构.面试.算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解.以及算法班的两位讲师朋友曹博.邹博的理解之后,写了9张PPT,发在微博上.随后,一不做二不休,索性将PPT上的内容整理到了本文之中(后来文章越写越完整,所含内容早已不再是九张PPT 那样简单

KMP算法详细理解

KMP算法详细理解 从昨天开始看KMP算法到今天凌晨..... 把一些知识点进行总结,其实KMP还是挺简单的(HHHHHH) 博客新地址:https://miraitowa2.top/ 1:BF(暴力匹配)算法 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符: 如

七分钟理解什么是 KMP 算法

本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三点再去阅读其它有关 KMP算法 的文章肯定能有个清晰的认识. 以下的文字描述请结合视频动画来阅读~ 视频地址:https://www.bilibili.com/video/av60334201/ 定义 Knuth-Morris-Pratt 字符串查找算法,简称为 KMP算法,常用于在一个文本串 S

KMP算法详解(图示+代码)

算法过程非常绕,不要企图一次就能看明白,多尝试就会明白一些.下面试图用比较直观的方法解释这个算法,对KMP算法的解释如下: 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止. 4. 接着比较字符串和搜索词的下一个字符,还是相同. 5. 直到字

KMP算法细节及增强KMP算法

preface: 想必,很多人都知道D.E.Knuth与V.R.Pratt和J.H.Morris同时提出所谓的狂拽酷炫屌炸天的KMP算法,在对字符串的匹配(或是字符串的查找)方面表现出比较好的效率,该算法对Brute-Force算法的较大改进,具体地讲就是消除了主串指针的回溯,从而使匹配的时间复杂度从O(N2)降低到O(N+M)(N为文本串的长度,M为模式串长度).其传神之处在于在于针对模式串构造的一个Nest[]数组(该数组只与模式串有关). keyword: KMP算法.增强KMP算法 (扯