KMP算法的next函数怎么计算

计软刷题时刷到一个题目,模式串p为“abaac”,求其next函数。代码就不解析了(我也没咋看),为了应试总结了一个快速答题技巧

首先,按位序、模式串、next函数写下来:

位序    1    2    3    4    5
模式串    a    b    a    a    c
next值                    
第一步:next值的前两位是0和1,代码是这样初始化的,记住就行了

位序    1    2    3    4    5
模式串    a    b    a    a    c
next值    0    1            
第二步:计算next第3位,即next[3]的值

位序    1    2    3    4    5
模式串    a    b    a    a    c
next值    0    1  

 当前计算结果=1        
比较基准:用前一位的模式串进行比较,记作模式串[2]吧,模式串[2] = b,  即比较基准为‘b’。

比较对象:与什么比较呢,前一位next值所对应的位序上的字符进行比较,因为next[2] = 1,所以与位序1上的字符即模式串[1] = a比较。将b与a进行比较。

计算结果:如果不相等,结果为1;如果相等,在前一位next值上+1。比较到模式串第一个字符为止。这里已经比较到第一个模式串字符了,而且b!=a,所以结果为1.

第三步:计算next第4位,即next[4]的值

位序    1    2    3    4    5
模式串    a    b    a    a    c
next值    0    1    1    

当前计算结果=2    
比较基准:用前一位的模式串进行比较,即模式串[3] = a,  即比较基准为‘a’。

比较对象:与什么比较呢,前一位next值所对应的位序上的字符进行比较,即与next[3] = 1位序上的字符比较,即模式串[1] = a。将a与a进行比较。

计算结果:如果不相等,结果为1;如果相等,在前一位next值+1。比较到模式串第一个字符为止。这里已经比较到第一个模式串字符了,而且a=a,所以结果为next[3]+1 = 1+1 = 2.

第四步:计算next第5位,即next[5]的值

位序    1    2    3    4    5
模式串    a    b    a       c
next值    0    1    1    2    
当前计算结果=2

比较基准:用前一位的模式串进行比较,即模式串[4] = a,  即比较基准为‘a’。

比较对象:

        与前一位next值所对应的位序上的字符进行比较,即与next[4] = 2位序上的字符比较,即模式串[2] = b。将a与b进行比较,不相等,当前结果初始化为1。

        因为没有比较到第1位的字符串,接着比较:与位序为next[2] = 1的字符比较,即模式串[1]=a。将a与a比较,相等,当前结果+1,即结果为1+1 = 2. 因为已经比较到第一位字符串了,所以比较结束。

         最终,next值为01122.

        总结一下,就是next的最开始两位为01.接下来每一位的值,都是用前面的一位模式串值去比较,一直比较到模式串的第一位为止。如果相等,当前结果为前一位的next值+1,如果不等,则初始化为1.

  • 8
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
next函数指的是生成器(generator)中的下一个。生成器是一种特殊的迭代器,在迭代过程中动态生成。通过调用生成器的next()函数,我们可以获取生成器中的下一个。 要求生成器中的下一个,我们可以按照以下步骤进行: 1. 定义一个生成器函数:生成器函数是一个使用yield语句的函数,当它被调用时,它返回一个生成器对象。 2. 创建一个生成器对象:通过调用生成器函数,我们可以创建一个生成器对象。生成器对象是一个迭代器,可以通过next()函数获取下一个。 3. 调用next()函数获取下一个:通过不断调用生成器对象的next()函数,我们可以获取生成器中的每一个。每次调用next()函数,生成器会从上一次yield语句处恢复执行,直到遇到下一个yield语句。 下面是一个简单的示例代码,演示了如何求解next函数: ```python def generator_function(): # 定义生成器函数 yield 1 # 生成器的第一个 yield 2 # 生成器的第二个 yield 3 # 生成器的第三个 generator = generator_function() # 创建生成器对象 print(next(generator)) # 输出:1 print(next(generator)) # 输出:2 print(next(generator)) # 输出:3 ``` 在这个示例中,我们定义了一个生成器函数`generator_function()`,它使用yield语句生成了三个。我们通过调用`next()`函数,依次获取了每一个,并打印出来。 需要注意的是,在生成器对象中的所有都被访问完之后,再次调用`next()`函数将会抛出StopIteration异常,表示生成器已经迭代完毕。所以,在使用`next()`函数时,需要注意处理这个异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值