Lesson 02

时间复杂度Time Complexity

案例

方法 1

找到所有 两个数 配对的可能

保留最高值

伪代码
Max2Sum(A,n)Max2Sum(A, n)
    sum0    sum \leftarrow 0
    for i1 to n    \text{for } i \leftarrow 1 \text{ to } n
        for j1 to n        \text{for } j \leftarrow 1 \text{ to } n
            if i!=j then            \text{if } i != j \text{ then}
                if Ai+ij>sum then                \text{if } A_i + i_j > sum \text{ then}
                    sum=Ai+Aj                    sum = A_i + A_j
return sum\text{return } sum

方法 2

循环一遍 找到最大值

再循环一遍 找到第二个大的值

伪代码
Max2Sum(A,n)Max2Sum(A, n)
    max10    max_1 \leftarrow 0
    for i1 to n    \text{for } i \leftarrow 1 \text{ to } n
        if Ai>max1 then        \text{if } A_i > max_1 \text{ then}
            max1Ai            max_1 \leftarrow A_i
    max20    max_2 \leftarrow 0
    for i1 to n    \text{for } i \leftarrow 1 \text{ to } n
        if Ai>max2 and Ai!=max1 then        \text{if } A_i > max_2 \text{ and } A_i != max_1 \text{ then}
            max2Ai            max_2 \leftarrow A_i
return max1+max2\text{return } max_1 + max_2

方法 3

跟方法 2 一样,但只走一趟

伪代码
Max2Sum(A,n)Max2Sum(A, n)
    max10    max_1 \leftarrow 0
    max20    max_2 \leftarrow 0
    for i1 to n    \text{for } i \leftarrow 1 \text{ to } n
        if Ai>max2 then        \text{if } A_i > max_2 \text{ then}
            max2Ai            max_2 \leftarrow A_i
        if Ai>max1 then        \text{if } A_i > max_1 \text{ then}
            Swap(max1,max2)            Swap(max_1, max_2)
return max1+max2\text{return } max_1 + max_2

相对优势 与 绝对优势

大于 某个值之后

我们比较大于某个值 ϵ\epsilon 后面的

相对优势

什么是

通过对 时间公式 叠加 常量倍数 会影响比较结果

案例
情况f(n)=nf(n) = ng(n)=2n,cg(n)g(n) = 2n, c \cdot g(n)更好
n=10,c=1n = 10, c = 11020f(n)f(n)
n=100,c=1n = 100, c = 1100200f(n)f(n)
n=10,c=1/10n = 10, c = 1/10102g(n)g(n)
n=100,c=1/10n = 100, c = 1/1010020g(n)g(n)
实际

如果设备一样 那么一个比一个好

但是可以通过砸钱在硬件设备上,彻底改变结果

函数图
 ϵ>0\exists \text{ } \epsilon > 0 
when n>ϵ and n\text{when } n > \epsilon \text{ and } n \rightarrow \infty
     c1>0,c1g(n)f(n) and     \exists \text{ } c_1 > 0, c_1 \cdot g(n) \geq f(n) \text{ and } 
     c2>0,f(n)c2g(n)    \exists \text{ } c_2 > 0, f(n) \geq c_2 \cdot g(n)

绝对优势

什么是

通过对 时间公式 叠加 常量倍数 不会 影响比较结果

案例
情况f(n)=nf(n) = ng(n)=n2,cg(n)g(n) = n^2, c \cdot g(n)更好
n=2,c=1n = 2, c = 124f(n)f(n)
n=2,c=1/10n = 2, c = 1/1020.4g(n)g(n)
n=20,c=1/10n = 20, c = 1/102040f(n)f(n)
n=20,c=1/100n = 20, c = 1/100204g(n)g(n)
n=200,c=1/100n = 200, c = 1/100200400f(n)f(n)
n=200,c=1/1000n = 200, c = 1/100020040g(n)g(n)
实际

就算通过砸钱在硬件设备上,当数据量大时也无法改变结果

函数图
 c>0\forall \text{ } c > 0 
 ϵ>0\exists \text{ } \epsilon > 0 
when n>ϵ and n\text{when } n > \epsilon \text{ and } n \rightarrow \infty
    cg(n)f(n) and     c \cdot g(n) \geq f(n) \text{ and } 

优势研究

侧重点

应该优先专注 提高绝对优势

代码可读性

当只有相对优势时,我们可以 专注代码可读性

速度档位

速度档位

相同档位

互相有相对优势的时间函数,被归类到一个速度档位内,他们的时间复杂度一样

nn2n2n 就在一个档位,时间复杂度一样

不同档位

有绝对优势的时间函数,就不会再一个速度档位上,他们的时间复杂度也不一样

nn时间增长慢低档位时间复杂度低更好
n2n^2时间增长快高档位时间复杂度高不好

Θ(n)\Theta(n)

什么是

如果 T1(n)=f(n)T_1(n) = f(n)T2(n)=g(n)T_2(n) = g(n) 在一个速度档位上

就说 f(n)=Θ(g(n))f(n) = \Theta(g(n))

含义

意思就是 f(n)f(n)g(n)g(n) 档位相同

集合含义

Θ(g(n))\Theta(g(n)) 代表 跟 g(n)g(n) 档位 相同的那些函数 所组成的集合

那么 f(n)=Θ(g(n))f(n) = \Theta(g(n))

意思就是 f(n)Θ(g(n))f(n) \in \Theta(g(n))

样例

n=Θ(n)n = \Theta(n)

n=Θ(2n)n = \Theta(2n)

O(n)O(n)

什么是

如果 T1(n)=f(n)T_1(n) = f(n)T2(n)=g(n)T_2(n) = g(n) 在一个速度档位上

或者 T1(n)=f(n)T_1(n) = f(n)T2(n)=g(n)T_2(n) = g(n) 有绝对优势

就说 f(n)=O(g(n))f(n) = O(g(n))

含义

意思就是 f(n)f(n) 档位 差不过 g(n)g(n)

集合含义

O(g(n))O(g(n)) 代表 跟 g(n)g(n) 档位 相同 以及 更好 的那些函数 所组成的集合

那么 f(n)=O(g(n))f(n) = O(g(n))

意思就是 f(n)O(g(n))f(n) \in O(g(n))

样例

n=O(n)n = O(n)

n=O(n2)n = O(n^2)

Θ(n)\Theta(n)O(n)O(n) 对比

如果 f(n) = \Theta(g(n)),那么 f(n) = O(g(n))

不能反过来。

练习

以下哪个是对的

1. n=Θ(n)n = \Theta(n)

2. n=Θ(2n)n = \Theta(2n)

3. 2n=Θ(n)2n = \Theta(n)

4. n=Θ(n2)n = \Theta(n^2)

5. n2=Θ(n)n^2 = \Theta(n)

6. n=O(n)n = O(n)

7. n=O(2n)n = O(2n)

8. 2n=O(n)2n = O(n)

9. n=O(n2)n = O(n^2)

10. n2=O(n)n^2 = O(n)

完整对比

相关推论 与 常用数学公式

证明档位

limnf(n)g(n)\lim_{n \to \infty} \frac{f(n)}{g(n)}

意义
1档位一样
0f(n)f(n)g(n)g(n) 有绝对优势
\inftyg(n)g(n)f(n)f(n) 有绝对优势

多项式后面抹除

如果时间公式为一个多项式,只需要保留最高档位的部分

比如

T(n)=n2+2n+1=O(n2)T(n) = n^2 + 2n + 1 = O(n^2)

常量系数抹除

如果时间公式为乘积,可以抹除常量系数

比如

T(n)=3n2=O(n2)T(n) = 3n^2 = O(n^2)

log 相关公式

a,b,ca, b, c 均为常数

去底
logan=logcnlogca=1logcalogcn=O(logcn)=O(logn)\log_a n = \frac{\log_c{n}}{\log_c{a}} = \frac{1}{\log_c{a}}\cdot\log_c{n} = O(\log_c{n}) = O(\log{n})
去幂
logna=alogn=O(logn)\log{n^a} = a\log{n} = O(\log{n})
去系数
logabn=logab+logan=O(logan)=O(logn)\log_{a}{bn} = \log_{a}{b} + \log_a{n} = O(\log_a{n}) = O(\log{n})

档位列表

O(1)=O(c)<O(logn)<O(n)<O(nlogn)<O(n2)<O(nc)<O(cn)O(1) = O(c) < O(\log n) < O(n) < O(n\log n) < O(n^2) < O(n^c) < O(c^n)

ZZAX 微信公众

文档一更新,立刻告诉你