首页 > 编程语言 > 详细

KMP,希尔排序

时间:2021-01-31 17:28:41      阅读:25      评论:0      收藏:0      [点我收藏+]

一、KMP算法

int *text(字符串文本),int *pattern(即需要匹配的字符串)

  KMP算法即是字符串匹配算法,常规解法是遍历text文本字符串,同时pattern跟着移动,当出现不匹配的字符时,text需要回到第二位,pattern需要回到0位,继续往后遍历,

直到pattern字符串完全匹配。显然此种算法比较暴力。

  而KMP算法核心是对pattern字符串进行回溯(计算pattern字符串里相同的最大子串记录到next数组里面),计算共同前缀和后缀相同数然后记录到next回溯数组里面,在text里遍历的时候,当不匹配的时候,text中的i将不需要回到前面,只需要将pattern的j位置移动到next(j-1)的位置,继续和text字符串文本进行比对,算法结束。

next计算方法:

void make_next(int* pattern, int* next){
	int p, k;
	int m = strlen(pattern);
	for(p=0, k=0; p<m; p++){
		while(k>0 && pattern[p] != pattern[k]){
			k = next[k-1];
		}
		if (pattern[p] == pattern[k]){
			k++;
		}
		netx[p] = k;
	}
}

然后再和text文本字符串里进行比较

int kmp(int* text, int* pattern, int* next){
	
	int i, j;
	int n = strlen(text);
	int m = strlen(pattern);
	make_next(pattern, next);
	for(i=0, j=0; i<n; i++){
		while(j>0 && text[i] != pattern[j]){
			j = next[j-1];
		}
		if(text[i] == pattern[j]){
			j++;
		}
		if(j == m){
			break;
		}
	}
	return i-m+1;
}

  

 

KMP,希尔排序

原文:https://www.cnblogs.com/wxj999/p/14352566.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!