zoukankan      html  css  js  c++  java
  • 手算KMP匹配的Next值和Nextval值

    转载 Slyar Home » 手算KMP匹配的Next值和Nextval值

    KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧。

    计算前缀 Next[i] 的值:

    我们令 next[0] = -1 。从 next[1] 开始,每求一个字符的 next 值,就看它前面是否有一个最长的"字符串"和从第一个字符开始的"字符串"相等(需要注意的是,这2个"字符串"不能是同一个"字符串")。如果一个都没有,这个字符的 next 值就是0;如果有,就看它有多长,这个字符的 next 值就是它的长度。

    计算修正后的 Nextval[i] 值:

    我们令 nextval[0] = -1。从 nextval[1] 开始,如果某位(字符)与它 next 值指向的位(字符)相同,则该位的 nextval 值就是指向位的 nextval 值(nextval[i] = nextval[ next[i] ]);如果不同,则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。

    举个例子:

    手算kmp的next和nextval

    计算前缀 Next[i] 的值:

    next[0] = -1;定值。
    next[1] = 0;s[1]前面没有重复子串。
    next[2] = 0;s[2]前面没有重复子串。
    next[3] = 0;s[3]前面没有重复子串。
    next[4] = 1;s[4]前面有重复子串s[0] = 'a'和s[3] = 'a'。
    next[5] = 2;s[5]前面有重复子串s[01] = 'ab'和s[34] = 'ab'。
    next[6] = 3;s[6]前面有重复子串s[012] = 'abc'和s[345] = 'abc'。
    next[7] = 4;s[7]前面有重复子串s[0123] = 'abca'和s[3456] = 'abca'。

    计算修正后的 Nextval[i] 值:

    nextval[0] = -1;定值。
    nextval[1] = 0;s[1] != s[0],nextval[1] = next[1] = 0。
    nextval[2] = 0;s[2] != s[0],nextval[2] = next[2] = 0。
    nextval[3] = -1;s[3] == s[0],nextval[3] = nextval[0] = -1。
    nextval[4] = 0;s[4] == s[1],nextval[4] = nextval[1] = 0。
    nextval[5] = 0;s[5] == s[2],nextval[5] = nextval[2] = 0。
    nextval[6] = -1;s[6] == s[3],nextval[6] = nextval[3] = -1。
    nextval[7] = 4;s[7] != s[4],nextval[7] = next[7] = 4。

  • 相关阅读:
    flutter 3des
    flutter踩坑记
    【OS_Windows】彻底关闭windows10自动更新
    使用 httpclient 上传下载文件
    git操作
    jmeter在Windows下请求https的接口
    python xlsxwriter简单使用
    asp.net core webapi 文件下载实现
    使用微信小程序连接到 MQTT 云服务
    MQTT.js 入门教程
  • 原文地址:https://www.cnblogs.com/china-sdd/p/6425718.html
Copyright © 2011-2022 走看看