复杂度分析

116 阅读1分钟

空间复杂度分析

消耗与数量无关

// 循环
int Sum(int a[], int n) {
    int tsum = 0;
    for (int i = 0; i < n; i++)
        tsum += a[i];
    return tsum;
}

消耗与数量有关

// 递归
int Rsum(int a[], int n) {
    if (n > 0)
        return Rsum(a, n - 1) + a[n - 1];
    return 0;
}

执行步数分析

多项式求值

P(x)=i=0ncixi=c0x0+c1x1++cnxnP(x)=\sum_{i=0}^nc_ix^i=c_0x^0+c_1x^1+\cdots+c_nx^n
int PolyEval(int c[], int n, int x) {
    int y = 1, value = c[0];
    for (int i = 1; i <= n; i++) { // n 次循环
        // 每次两个乘法一个加法
        y *= x;
        value += y * c[i];
    }
    return value;
}

Horner 算法

P(x)=(((cnx+cn1)×x+cn2))×x+c0P(x)=(((c_nx+c_{n-1})×x+c_{n-2})\cdots)×x+c_0
int Horner(int c[], int n, int x) {
    int value = c[n];
    for (int i = 1; i <= n; i++) { // n 次循环
        // 一次乘法一次加法
        value = value * x + c[n - i];
    }
    return value;
}

一般程序

int Sum(int a[], int n) {
    int tsum = 0, count;
    count++;  // 赋值操作(tsum = 0)

    for (int i = 0; i < n; i++) {
        count++;  // 每次 for 循环判断(i<n)
        tsum += a[i];
        count++;  // 加等操作(tsum += a[i])
    }
    count++;  // 最后一次 for 循环判断
    count++;  // return 操作
    return tsum;
}

image.png

递归程序

int Rsum(int a[], int n) {
    int count;
    count++;  // if 语句
    if (n > 0) {
        count++;  // 加法操作
        count++;  // return 操作
        return Rsum(a, n - 1) + a[n - 1];
    }
    count++;  // return 操作
    return 0;
}

t(0)=2t(n)=t(n-1)+3

image.png

时间复杂度分析

上界 O

O 不一定是最小上界, 但一般都是求最小上界

f(n)=O(g(n))f(n)=O(g(n)) , 当且仅当存在数 ccn0n_0, 使得对所有 nn0n≥n_0 , 有 f(n)cg(n)f(n)≤cg(n) , 则称 ggff 的上界

例如, f(n)=3n+3f(n)=3n+3 , 当 n3n≥3 时, 3n+33n+n=4n3n+3≤3n+n=4n, 因此 f(n)=O(4n)f(n)=O(4n)

f(n)=10n2+4n+2f(n)=10n^2+4n+2 , 当 n2n≥2 时, f(n)10n2+5nf(n)≤10n^2+5n , 当 n5n≥5 时, 5nn25n≤n^2 , 因此 n5n≥5 时, f(n)10n2+n2=11n2f(n)≤10n^2+n^2=11n^2 , 所以 f(n)=O(n2)f(n)=O(n^2)

松散上界

n2n≥2 时, f(n)=3n+3<n2f(n)=3n+3<n^2, 因此 n2n^2f(n)f(n) 的松散上界

下界 Ω

Ω(g(n))Ω(g(n)) , 当且仅当存在数 ccn0n_0 , 使得对所有 nn0n≥n_0 , 有 f(n)cg(n)f(n)≥cg(n)

例如, 对于所有的 nn , f(n)=3n+3>3nf(n)=3n+3>3n , 因此 f(n)=Ω(n)f(n)=Ω(n)

f(n)=10n2+4n+2>10n2f(n)=10n^2+4n+2>10n^2 , 因此 f(n)=Ω(n2)f(n)=Ω(n^2)

非最大下界

3n+3=Ω(1)3n+3=Ω(1) , 10n2+4n+2=Ω(n)10n^2+4n+2=Ω(n)

上下界 Θ

Θ(g(n))Θ(g(n)) , 当且仅当存在数 c1c_1 , c2c_2n0n_0 , 使得对所有 nn0n≥n_0 , 有 c1g(n)f(n)c2g(n)c_1g(n)≤f(n)≤c_2g(n)

例如对于 n2n\ge2 存在 3n3n+24n3n\le3n+2\le4n , 因此 3n+2=Θ(n)3n+2=\Theta(n)

上界非下界 o

例如 3n+2=O(n2)3n+2=O(n^2) 但是 3n+2Ω(n2)3n+2≠Ω(n^2)