KMP算法的原理,你真的懂了吗?
- 内容介绍
- 文章标签
- 相关推荐
呃... 你真的懂KMP算法吗?这玩意儿, 说白了就是个字符串匹配的“神器”——虽然它看起来像外星语,但你只要别怕,它其实没那么难搞。我们今天就来“浅谈”一下这个算法,顺便说说它到底怎么个牛X法。
先说说KMP是啥玩意儿
还行。 先说说 KMP算法,全称“Knuth-Morris-Pratt”,是字符串匹配界的“老司机”。它能让你在一堆字符串里像找对象一样精准地找出你要的那一个子串。这算法的牛人Knuth、 Morris、Pratt,他们仨人一拍即合,搞出了这个算法,就是为了解决一个大问题:怎么在一堆字符串里找东西,而且要找得快、找得准。

那KMP到底牛在哪?
简单说 KMP算法的牛X之处在于它能让你在主串里找模式串的时候,不回头,不重复,不浪费时间。它不像你, 看到一个字母不对就从头再来而是聪明地跳过那些没必要的比较,直接上手干正事,不带拖泥带水的。
再聊聊KMP的“灵魂”——next数组
这个next数组,就是KMP的“灵魂伴侣”。它记录了模式串中每个位置的“前缀和后缀”最长匹配长度。 干就完了! 啥意思?就是说如果模式串里有重复的片段,那这个数组就能帮你记住“我前面是不是见过你?”
比如模式串是"A娱乐DAB", 那next数组就告诉你,如果前面的"AB"你已经匹配失败了那我直接跳过不回头,不比较,直接从失败的地方继续匹配,这就是KMP的“跳跳乐”精神。
暴力匹配的“黑历史”
一阵见血。 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,暴力法可能要从头到尾比10000次KMP说:我只要一次!
所以KMP算法的出现,就是为了解决“暴力匹配”这个大坑。它的“跳跳乐”精神。
那KMP到底怎么用?
我们来举个例子:
例子1:模板匹配
| 产品名称 | 匹配效率 | 使用难度 |
| KMP算法 | 高 | 中 |
| 暴力匹配 | 中 | 低 |
| AC自动机 | 中 | 高 |
你看, KMP算法,就是个“跳跳乐”算法,跳过那些没用的比较,直接上手干正事。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不带重复比较,直接上手干正事。所以KMP算法,就是个“跳跳乐”算法。
例子2:KMP算法的“跳跳乐”精神
调整一下。 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,那我直接跳过不回头,不重复,直接上手干正事。
所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不带重复比较,直接上手干正 事 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较,直接上手干正事,他破防了。。
切记... 所以KMP算法,就是个“跳跳乐”算法。 那KMP算法到底怎么用? 我们来举个例子: 例子12:KMP算法的“跳跳乐”精神 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。
可不是吗! 那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,那我直接跳过不回头,不重复比较,直接上手干正事。 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较,直接上手干正事。
所以KMP算法,就是个“跳跳乐”算法。 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较, 我好了。 直接上手干正事。所以KMP算法,就是个“跳跳乐”算法。 那KMP算法到底怎么用? 我们来举个例子: 例子11:KMP算法的“跳跳乐”精神 你可能要问了为啥不用暴力匹配?
呃... 你真的懂KMP算法吗?这玩意儿, 说白了就是个字符串匹配的“神器”——虽然它看起来像外星语,但你只要别怕,它其实没那么难搞。我们今天就来“浅谈”一下这个算法,顺便说说它到底怎么个牛X法。
先说说KMP是啥玩意儿
还行。 先说说 KMP算法,全称“Knuth-Morris-Pratt”,是字符串匹配界的“老司机”。它能让你在一堆字符串里像找对象一样精准地找出你要的那一个子串。这算法的牛人Knuth、 Morris、Pratt,他们仨人一拍即合,搞出了这个算法,就是为了解决一个大问题:怎么在一堆字符串里找东西,而且要找得快、找得准。

那KMP到底牛在哪?
简单说 KMP算法的牛X之处在于它能让你在主串里找模式串的时候,不回头,不重复,不浪费时间。它不像你, 看到一个字母不对就从头再来而是聪明地跳过那些没必要的比较,直接上手干正事,不带拖泥带水的。
再聊聊KMP的“灵魂”——next数组
这个next数组,就是KMP的“灵魂伴侣”。它记录了模式串中每个位置的“前缀和后缀”最长匹配长度。 干就完了! 啥意思?就是说如果模式串里有重复的片段,那这个数组就能帮你记住“我前面是不是见过你?”
比如模式串是"A娱乐DAB", 那next数组就告诉你,如果前面的"AB"你已经匹配失败了那我直接跳过不回头,不比较,直接从失败的地方继续匹配,这就是KMP的“跳跳乐”精神。
暴力匹配的“黑历史”
一阵见血。 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,暴力法可能要从头到尾比10000次KMP说:我只要一次!
所以KMP算法的出现,就是为了解决“暴力匹配”这个大坑。它的“跳跳乐”精神。
那KMP到底怎么用?
我们来举个例子:
例子1:模板匹配
| 产品名称 | 匹配效率 | 使用难度 |
| KMP算法 | 高 | 中 |
| 暴力匹配 | 中 | 低 |
| AC自动机 | 中 | 高 |
你看, KMP算法,就是个“跳跳乐”算法,跳过那些没用的比较,直接上手干正事。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不带重复比较,直接上手干正事。所以KMP算法,就是个“跳跳乐”算法。
例子2:KMP算法的“跳跳乐”精神
调整一下。 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,那我直接跳过不回头,不重复,直接上手干正事。
所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不带重复比较,直接上手干正 事 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较,直接上手干正事,他破防了。。
切记... 所以KMP算法,就是个“跳跳乐”算法。 那KMP算法到底怎么用? 我们来举个例子: 例子12:KMP算法的“跳跳乐”精神 你可能要问了为啥不用暴力匹配?那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。
可不是吗! 那是主要原因是暴力匹配太“暴力”了。它会一个一个地比,比到你烦,比到我烦,比到地球都烦。比如你有10000个字符要匹配,那我直接跳过不回头,不重复比较,直接上手干正事。 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较,直接上手干正事。
所以KMP算法,就是个“跳跳乐”算法。 所以KMP算法,就是个“跳跳乐”算法。它能让你在10000个字符里 找到你要的那一个子串,而且不带拖泥带水,不带回头,不重复比较, 我好了。 直接上手干正事。所以KMP算法,就是个“跳跳乐”算法。 那KMP算法到底怎么用? 我们来举个例子: 例子11:KMP算法的“跳跳乐”精神 你可能要问了为啥不用暴力匹配?

