鱼C论坛

 找回密码
 立即注册
查看: 3393|回复: 3

KMP优化算法求出的next数组错误

[复制链接]
发表于 2013-9-8 15:57:17 | 显示全部楼层 |阅读模式
1鱼币
//预定义常量和类型

//函数结果状态代码
#include <stdio.h>
#include<stdlib.h>
#include <time.h> 
#include<windows.h>
#include<math.h>
//#include<unistd.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define MAX_STR_LEN 255

typedef unsigned char String[MAX_STR_LEN+1];

Status StrAssign(String T,char *chars)
{
//生成一个其值等于chars的串T 
int i;
if(strlen(chars)>MAX_STR_LEN)
{
return ERROR;
}
else
{
T[0]=strlen(chars);//0号单元存放串的长度
for(i=1;i<=T[0];i++)//从1号单元起复制串的内容
{
T[i]=*(chars+i-1);
}
return OK;
}

}

void get_next( String T, int *next )
{
int j = 0;
int i = 1;
next[1] = 0;

while( i < T[0] )
{
if( 0 == j || T[i] == T[j] )
{
i++;
j++;
if( T[i] != T[j] )
{
next[i] = j;
}
else
{
next[i] = next[j];
}
}
else
{
j = next[j];
}
}

for(i=1;i<=T[0];i++)
{
printf("%d ",next[i]);
}
printf("\n");
}

// 杩斿洖瀛愪覆T鍦ㄤ富涓睸绗琾os涓瓧绗︿箣鍚庣殑浣嶇疆
// 鑻ヤ笉瀛樺湪锛屽垯杩斿洖0
int Index_KMP( String S, String T, int pos )
{
int i = pos;
int j = 1;
int next[255];

get_next( T, next );

while( i <= S[0] && j <= T[0] )
{
if( 0 == j || S[i] == T[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
}

if( j > T[0] )
{
return i - T[0];
}
else
{
return 0;
}
}

main()
{
char *chars1="ababaaaba"; //这里赋值给T
char *chars2="fababcabdabababaaabacabeabababe";
String T,S;
int next[255];

StrAssign(T,chars1);
StrAssign(S,chars2);

get_next(T, next );

return 0;
}
模式串T="ababaaaba"
优化算法得出的next数组=0 1 0 1 0 4 2 1 0
正确的next数组应该    是=0 1 1 2 3 4 2 2 3

请问是为什么,是算法错了吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-8 20:34:26 | 显示全部楼层
谁帮我看下啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 17:13:30 | 显示全部楼层
谁帮下我啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 18:28:29 | 显示全部楼层
没有问题了,两个数组都可以得到一样的匹配结果,昨天支行时老出错,今天就可以了,谢谢大家,问题解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表