알고리즘 케이스 분석-문자열 패턴 매칭 알고리즘
나는 당신과 공유하기 위해 인터넷에서 고품질 블로그를 보았습니다. 잘 알려진 블로거 "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
}
}
여기서 문자열 패턴 매칭 알고리즘을 공유하겠습니다. 결함이 있으면 모두가 정정 해 주셨으면합니다. |
---|
원본을 지원하십시오