KMP

1.引入

如何在10G文件中相对比于BF算法更好查找关键字"abcdefg"呢?我们引入字符串搜索算法之KMP算法.

2.理解与源码

代码:

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


void make_next(const char *pattern, int *next) {

	int q, k;// q-指向后缀,代表后缀从哪个地方开始算;k-指向前缀,代表前缀从哪个地方开始算
	int m = strlen(pattern);
	next[0] = 0;
	for (q = 1,k = 0;q < m; q ++) {

		while (k > 0 && pattern[q] != pattern[k])
			k = next[k-1];
		if (pattern[q] == pattern[k]) {
			k ++;
		}
		next[q] = k;

	}
	// next[0] = 0;
	// q=1, k=0, pattern[q]:pattern[k] = b:a, next[1] = 0;
	// q=2, k=0, pattern[q]:pattern[k] = c:a, next[2] = 0;
	// q=3, k=0, pattern[q]:pattern[k] = a:a, k++, next[3] = 1;
	// q=4, k=1, pattern[q]:pattern[k] = b:b, k++, next[4] = 2;
	// q=5, k=2, pattern[q]:pattern[k] = c:c, k++, next[5] = 3;
	// q=6, k=3, pattern[q]:pattern[k] = d:a, k=next[k-1] -> k=0; next[6] = 0;
}


int kmp(const char *text, const char *pattern, int *next) {

	int n = strlen(text);
	int m = strlen(pattern);

	make_next(pattern, next);
	
	int i, q;
	for (i = 0, q = 0;i < n;i ++) {

		while (q > 0 && pattern[q] != text[i]) {
			q = next[q-1];
		}

		if (pattern[q] == text[i]) {
			q ++;
		}

		if (q == m) {
			//printf("Pattern occurs with shift: %d\n", (i-m+1));
			break;
		}
	}

	return i-q+1;
}

int main() {

	int i;
	int next[20] = {0};

	char *text = "ababxbababababcdababcabddcadfdsss";
	char *pattern = "abcabd";

	int idx = kmp(text, pattern, next);
	printf("match pattern : %d\n", idx);// 打印出的值是找到这个串的索引值

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

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值