KMP算法的一些误区及其优化

本文通过重温严蔚敏的数据结构,详细讲解了KMP算法的next数组优化,强调next数组是针对子串PATTERN的,记录的是前缀-后缀的最大长度,并提供了优化next数组的代码示例,讨论了最坏情况下的时间复杂度,指出优化对于提高算法效率的重要性。
摘要由CSDN通过智能技术生成

      16年12月26日再次编辑

昨晚在看清华严蔚敏的数据结构,重温了一遍KMP算法。严奶奶讲的特别详细特别透彻。发现自己还是有一些东西想岔了,这里重新修补下原来的博文。

问题主要集中在next[]数组的优化方面,在原来的地方用红色重写一下。



                 *********************************我是原来博文的分隔符********************************

这两天在看哈工大王宏志老师的算法设计入门课,讲到了KMP算法,这个之前也学习过,但一直没有搞的特别明白。于是花了两天的时间,看博客什么的,比如http://www.aboutyun.com/thread-9994-1-1.html就讲的很好。总之现在终于稍微清楚一点了,有一些相关的误区和优化想记录下来.。代码均在xcode(GCC)上可通过,都是很浅的东西,不知道有没有比我还小白的人看。

1. HOW TO GET next[]

   (1) 明确next数组是针对子串PATTERN的,与原字符串S无关!//有一个相互匹配的问题,两个字符串,一般长的是S。或者,不重复的是S。(为什么?因为复杂度与p的长度有关,也与重复性有关。)

  (2)next数组记录的是前缀-后缀的最大长度,而不是个数. 前缀中每一个都含有首字符,后缀中每一个都含有末字符。比较时是类似队列那种依次向后的比较方法。可以分为4种情况:

    (3) 最笨的方法,非递归,没有出现k=next[k] or k=next[k-1] 这种情况


void GetNext(char* p,int next[])
{
    next[0] = 0;
    int k = 0;
    int j = 1;
    while (j < strlen(p) )
    {
        //k是前缀下标,j是后缀下标
        if(k!=0 && p[k]!=p[j])  //分四种情况,根据k是否等于0(或>0,一样的,因为K不会<0)和P[K]是否等于p[j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值