私は、外側のループの時間計算量がO(nm)であると述べている本を読んでいましたが、内側のループの場合、本は次のように説明しています。
「内側のwhileループは最大でm回周回し、パターンマッチが失敗した場合ははるかに少なくなる可能性があります。これに加えて、他の2つのステートメントは、外側のforループ内にあります。外側のループは最大でn-m回周回します。テキストの右側に移動しすぎると、完全な位置合わせが可能になります。ネストされたループの時間計算量は倍増するため、最悪の場合の実行時間はO((n − m)(m + 2))になります。 "
内部ループの時間計算量がO(m)ではなくO(m + 2)である理由がわかりませんでしたか?助けてください。
int findmatch(char *p, char *t)
{
int i,j; /* counters */
int m, n; /* string lengths */
m = strlen(p);
n = strlen(t);
for (i=0; i<=(n-m); i=i+1) {
j=0;
while ((j<m) && (t[i+j]==p[j]))
j = j+1;
if (j == m) return(i);
}
return(-1);
}