确定时间复杂度

时间:2012-12-27 05:04:02

标签: c++ big-o

我正在读一本书,它告诉我们外部循环的时间复杂度是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);
}

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