本规范的运行时复杂性是多少?

时间:2015-02-25 18:50:10

标签: c++ algorithm complexity-theory analysis

本规范的运行时复杂性是什么?

#include <cstdio>
#include <cstring>
int main()
{
    int n, i, l, j, c, ans = 25;
    scanf("%d", &n);
    char x[21], y[21];
    scanf("%s", &x);
    l = strlen(x);
    for(i=1; i<n; i++)
    {
        scanf("%s", &y);
        c = 0;
        for(j=0 ;j<l; j++)
            if(x[j] == y[j])
                c++;
            else
                break;
        strcpy(x, y);
        if(ans > c)
            ans = c;
    }
    printf("%d", ans);
    return 0;
}

我的讲师告诉我,这段代码的复杂性是O(n*n),但我没有说服这个答案,因为内部循环会运行字符串长度。

1 个答案:

答案 0 :(得分:2)

main()的运行时由一些常量语句的运行时和i的运行时循环组成:

T_main(n, l) ∈ O(1) + T_fori(n, l)

i - 循环完全运行(n - 1)次,由一些常量语句和j循环的运行时组成:

T_fori(n, l) ∈ (n - 1) * (O(1) + T_forj(n, l))

j循环的运行时间取决于数据。在最好的情况下,xy的第一个字符是不同的,因此:

T_forj_best(n, l) ∈ 1 * O(1)

在最糟糕的情况下,xy的{​​{1}}等于第一个字符,因此:

l

这会产生:

T_forj_worst(n, l) ∈ l * O(1) = O(l)

T_fori_best(n, l)  ∈ (n - 1) * (O(1) + O(1)) = O(n)
T_fori_worst(n, l) ∈ (n - 1) * (O(1) + O(l)) = O(n * l)