알고리즘 케이스 분석-문자열 패턴 매칭 알고리즘

알고리즘 케이스 분석-문자열 패턴 매칭 알고리즘

나는 당신과 공유하기 위해 인터넷에서 고품질 블로그를 보았습니다. 잘 알려진 블로거 "Little Grey Ape" 에서 복각 , 원하신다면 원작을 응원 해주세요.

원본 링크


오늘은 문자열 비교에 대한 패턴 매칭 알고리즘을 알려 드리겠습니다. 데이터 구조에서 문자열에 대한 관련 연산 중 부분 문자열에 대한 위치 지정 연산을 일반적으로 문자열 패턴 매칭이라고하며 다양한 문자열 처리에서 가장 중요합니다. 중요한 연산 중 하나이며 하위 문자열은 패턴 문자열이라고도하며, 주로 기본 문자열과 패턴 문자열에 대해 일반적으로 사용되는 두 가지 일치 알고리즘이 있습니다 : 나이브 패턴 일치 알고리즘과 KMP 알고리즘 (개선 된 패턴 일치 알고리즘). 이 두 알고리즘을 개별적으로 분석하십시오.

1. 순진한 패턴 매칭 알고리즘

순진한 패턴 매칭 알고리즘은 Brute-Fuchs 알고리즘으로도 알려져 있으며 기본 개념은 메인 문자열의 첫 번째 문자와 패턴 문자열의 첫 번째 문자를 비교하는 것입니다. 문자가 비교됩니다. 그렇지 않으면 패턴 문자열의 각 문자가 기본 문자열의 연속 문자 시퀀스와 일치 할 때까지 기본 문자열의 두 번째 문자가 패턴 문자열의 첫 번째 문자와 다시 비교됩니다. 일치가 성공한 경우 패턴 문자열과 일치하는 내용을 기본 문자열에서 찾을 수없는 경우이를 일치 실패라고합니다.

다음으로 간단한 패턴 매칭 알고리즘을 구현하기 위해 문자열을 문자 배열에 저장하는 예제를 제공합니다.

//传入主串s和模式串t,同时设定从主串中开始匹配的位置pos
int index(char s[],char t[],int pos) {
	int i,j,slen,tlen;
	i = pos;
	j = 0;
	slen = s.length;	//获取到主串的长度
	tlen = t.length;	//获取到模式串的长度
	while (i<slen && j<tlen) {
		if (s[i] == t[j]) {
			i++;
			j++;
		}
		else {
			i = i-j+1;
			j=0;
		}		
	}
	if (j>=tlen) {
		return i-tlen;
	}
	return 1;
}

2. KMP 알고리즘 (개선 된 패턴 매칭 알고리즘)

KMP 알고리즘은 기존 알고리즘을 개선 한 것으로, 순진한 패턴 매칭 알고리즘에 비해 메인 문자열과 패턴 문자열의 매칭 과정에서 비교 된 문자가 일치하지 않을 때마다 KMP 알고리즘은 되돌아 갈 필요가 없습니다. 얻은 "부분 일치"결과를 사용하는 대신 기본 문자열의 문자 위치 포인터는 비교를 계속하기 전에 패턴 문자열을 가능한 한 오른쪽으로 "슬라이드"합니다.

패턴 문자열이 "P0 ... P (m-1)"이라고 가정하면 KMP 매칭 알고리즘의 아이디어는 다음과 같습니다. 패턴 문자열의 문자 Pj가 기본 문자열의 해당 문자 Si와 같지 않을 때 첫 번째 j 문자 ( "P0 … P (j-1)”)이 성공적으로 일치되었으므로 패턴 문자열의“P0… P (k-1)”이“P (jk)… P (j-1)”과 같으면 P0은 Si와 비교할 수 있으므로 롤백 할 필요가 없습니다.

KMP 알고리즘에서는 패턴 문자열의 다음 함수 값에 따라 부분 문자열의 슬라이딩을 구현할 수 있습니다. next [j] = k이면 next [j]는 패턴 문자열의 Pj가 주 문자열의 해당 문자와 ​​같지 않을 때를 의미합니다. , 패턴 문자열의 Pnext [j]를 기본 문자열의 해당 문자와 ​​비교합니다.

다음 함수의 정의는 다음과 같습니다.

여기에 사진 설명 삽입

다음은 패턴 문자열의 다음 함수를 찾는 절차입니다.

//求模式串p的next函数值,并存入数组next中
void Get_next(char *p,int next[])
{
	int i,j,slen;
	slen = strlen(p);	//获取到模式串的长度
	i=0;
	while (i<slen) {
		if (j==-1||p[i]==p[j]) {
			++i;
			++j;
			next[i] = j;
		} else {
			j = next[j];
		}
	}
}

다음 기능을 획득 한 후

KMP 패턴 매칭 알고리즘에서 패턴 문자열의 첫 번째 문자의 첨자가 0 인 경우 KMP 알고리즘은 다음과 같습니다.

/*利用模式串p的next函数,求p在主串s中从第pos个字符开始的位置*/
/*若匹配成功,返回模式串在主串的位置下标,否则返回-1 */
int Index_KMP(char *s,char *p,int pos,int next[])
{
	int i,j,slen,plen;
	i=pos-1;
	j=-1;
	slen = strlen(s);	//求主串的长度
	plen = strlen(p);	//求模式串的长度
	while (i<slen && j<plen) {
		if (j==-1||s[i]==p[j]) {
			++i;
			++j;
		} else {
			j=next[j];
		}
	}
	if (j>=plen) {
		return i-plen;
	}
	else {
		return -1
	}
		
}
여기서 문자열 패턴 매칭 알고리즘을 공유하겠습니다. 결함이 있으면 모두가 정정 해 주셨으면합니다.

여기에 사진 설명 삽입

원본을 지원하십시오

원본 링크

추천

출처blog.csdn.net/weixin_45820444/article/details/108544901