U2yyy 2022-08-14 21:00 采纳率: 71.4%
浏览 99
已结题

为什么KMP匹配算法的next[1]为0

今天学习KMP匹配算法时,注意到next[j]当j=1时似乎要取0,为什么是这样呢?

KMP匹配算法里面的next[ ]不是用来统计到目前为止有多少个公共前后缀吗,在《大话数据结构》以及我查阅的很多资料中,像模式字符串abcabx,它的next[ ]应当是 011123,这是我不太能理解的。我认为next[] 应该是 000120,而且我用这样的next[ ]似乎实现了同样的功能,即避免i值回溯,以实现时间复杂度为O(m+n)。

我想知道我的实现方法是否可行,然后我还想知道书上和一些资料里面的next[ ]到底是怎么来的,它对我来说似乎过于抽象了,我理解不了。

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>

void getNext(int* next,char pattern[],int length);
int KMP_search(char *s,char *p,int pos,int p_length,int s_length);

int main()
{
    char p[] = "abcabx";
    char s[] = "babcabxss";
/*     int l = sizeof(p)/sizeof(p[0]) - 1;
    int next[l];
    getNext(next,p,l);
    for(int i =0;i<l;i++)
    {
        printf("%d ",next[i]);
    } */
    int p_length = sizeof(p)/sizeof(p[0])-1;
    int s_length = sizeof(s)/sizeof(s[0])-1;
    int pos = KMP_search(s,p,0,p_length,s_length);
    printf("%d ",pos);
    system("pause");
}

void getNext(int* next,char pattern[],int length)
{
    next[0] = 0;
    int i = 0,j = 1;
    while(j<length)
    {
        if(pattern[j] == pattern[i])
        {   
            next[j] = i+1;
            j++;
            i++;
        }
        else if(i == 0)
        {
            next[j] = i;
            j++;
        }
        else
        {
            i = next[i];
        }
    }
}

int KMP_search(char *s,char *p,int pos,int p_length,int s_length)
{
    int i = pos;
    int j = 0;
    int next[256];
    getNext(next,p,p_length);
    while(i<s_length&&j<p_length)
    {
        if(s[i] == p[j])
        {
            i++;
            j++;
        }
        else if(j == 0)
        {
            i++;
        }
        else
        {
            j = next[j];
        }
    }
    if(j == p_length)
    {
        return i-j;
    }
    else
    {
        return -1;
    }
}

  • 写回答

4条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-08-15 08:40
    关注

    next 数组考虑的是除当前字符外的最长相同前缀后缀,因为除了当前字符外,1前面只有一个字符,不可能会出现公共前缀的,所以next(1)是0

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 赞助了问题酬金10元 8月14日
  • 修改了问题 8月14日
  • 展开全部

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)