使用递归的方法求next值来理解KMP算法(待继)

来源:互联网 发布:离婚率数据 编辑:程序博客网 时间:2024/06/06 01:29

转载请注明本地址啊微笑


关于数据结构的书都会有这样的主题:”有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?“。最锉的做法就是一个字节一个字节的比对和偏移,直至找到全部值,这也是所谓暴力解法。另一个巧妙的算法就是KMP算法。不知道什么KMP算法?!咳咳……没关系了,向你推荐JULY大神的”巨著“,这篇文章讲得实在太好太详细了,以至我都没能耐心地看完大笑


那这编文章不会是来打酱油的吧~

请放心,这篇文章绝不是为了混个脸熟的生气

身边有不少的朋友对KMP里的模式串P的next值是怎么求得的还不是很明白,我也是费了好些神才算彻底搞懂。这里写下我的一些心得:用递归的方法,用另一种讲解思路向大家描述next值是怎么求得的。


#include <stdio.h>#include <string.h>#include <stdlib.h>int get_kmp_ext_(char *src, char next[], int k, int p, int src_len, char next_val){if(next_val != -1){next[k] = next_val;}if(k >= src_len){return 0;}if(src[k] == src[p]){k++;p++;next_val = p;printf("(src[k] == src[p]) -- (%d, %c), (%d, %c) next=%d\n", k, src[k], p, src[p], next_val);}else{if(p == 0){k++;next_val = 0;printf("(p == 0) -- (%d, %c), (%d, %c) next=%d\n", k, src[k], p, src[p], next_val);}else{p = next[p];next_val = -1;printf("(p != 0) -- (%d, %c), (%d, %c) next=%d\n", k, src[k], p, src[p], next_val);}}return get_kmp_ext_(src, next, k, p, src_len, next_val);}int get_kmp_ext(char *src, char next[], int src_len){next[0] = -1;return get_kmp_ext_(src, next, 1, 0, src_len, 0);}int main(int argc, char *argv[]){char *src;char *next;int src_len;if(argc < 2){printf("arg is too less - argc=%d\n", argc);return -1;}src = argv[1];printf("src:\n%s\n", src);src_len = strlen(src);next = malloc(src_len);get_kmp_ext(src, next, src_len);printf("get_kmp_ext finished\n");int i;printf("next:\n");for(i = 0; i < src_len; i++){printf("%d ", next[i]);}printf("\n");return 0;}

运行结果:




原创粉丝点击