我正在读一本书,它告诉我们外部循环的时间复杂度是O(n-m),而对于内部循环,这本书给出的解释是
“内部while循环最多m次,并且可能 当模式匹配失败时,更少。这个加上另外两个 语句,位于外部for循环中。外环绕过去 最多n-m次,因为一旦我们得到,就不可能完全对齐 文本右侧太远了。嵌套循环的时间复杂度 乘以,所以这给出了最坏情况下的运行时间O((n - m)(m + 2))。 “
我不明白为什么内环的时间复杂度是O(m + 2)而不是O(m)?请帮忙。
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);
}
答案 0 :(得分:0)
while循环:
while ((j<m) && (t[i+j]==p[j]))
j = j+1;
是O(m),那么你从(other statements
)得到+2:
j=0; // + 1
// loop
if (j == m) return(i); // + 1