アルゴリズムケース分析-文字列パターンマッチングアルゴリズム
私はあなたと共有するためにインターネットで高品質のブログを見ました。有名ブロガー「Little Grey Ape」から転載しましたので、よろしければオリジナルをご支持ください。
元のリンク
今日は、文字列比較に関するパターンマッチングアルゴリズムについて説明します。データ構造内の文字列に対する関連操作の中で、部分文字列に対する位置付け操作は通常、文字列パターンマッチングと呼ばれ、さまざまな文字列処理において最も重要です。重要な操作の1つであり、部分文字列はパターン文字列とも呼ばれます。主文字列とパターン文字列には、主に2つの一般的に使用されるマッチングアルゴリズムがあります。単純なパターンマッチングアルゴリズムとKMPアルゴリズム(改良されたパターンマッチングアルゴリズム)です。これら2つのアルゴリズムを個別に分析します。
1.単純なパターンマッチングアルゴリズム
素朴なパターンマッチングアルゴリズムは、Brute-Fuchsアルゴリズムとも呼ばれ、基本的な考え方は、メイン文字列の最初の文字とパターン文字列の最初の文字を比較することです。文字が比較されます。それ以外の場合は、パターン文字列の各文字がメイン文字列の連続する文字のシーケンスと一致するまで、メイン文字列の2番目の文字がパターン文字列の最初の文字と再比較されます。一致が成功した場合、パターン文字列と一致するコンテンツがメイン文字列で見つからない場合、一致失敗と呼ばれます。
次に、文字列を文字配列に格納して、単純なパターンマッチングアルゴリズムを実装する例を示します。
//传入主串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
}
}
ここでは文字列パターンマッチングアルゴリズムを紹介します。欠陥があった場合は、どなたでも修正していただければ幸いです。 |
---|
オリジナルを応援してください