第一~五章 算法基础、时间复杂度、分治法 1.x 算法概述 算法五个特征 详见名词解释
2.1 渐进表示法 大O记号 n → ∞ n \to \infty n → ∞ 时,f ( n ) f(n) f ( n ) 不会快于 g ( n ) g(n) g ( n )
如果存在正数c c c 和n 0 n_0 n 0 ,使得当n ≥ n 0 n \geq n_0 n ≥ n 0 时,有f ( n ) ≤ c g ( n ) f(n) \leq cg(n) f ( n ) ≤ c g ( n ) ,则称f ( n ) f(n) f ( n ) 是O ( g ( n ) ) O(g(n)) O ( g ( n )) 的。c c c 和n 0 n_0 n 0 怎么找?系数加一 。 简单地说,如果f ( n ) f(n) f ( n ) 最高项为一次项(例如3 n + 2 3n+2 3 n + 2 ),那么就把常数项放掉 ,看n n n 等于几时f ( n ) f(n) f ( n ) 的值开始小于4 n 4n 4 n 。 如果f ( n ) f(n) f ( n ) 既有一次项又有二次项(例如3 n 2 + 2 n + 1 3n^2+2n+1 3 n 2 + 2 n + 1 ),那么首先把常数项放掉 ,看n n n 等于几时f ( n ) f(n) f ( n ) 的值开始小于3 n 2 + 3 n 3n^2+3n 3 n 2 + 3 n ;再把一次项放掉 ,看n n n 等于几时f ( n ) f(n) f ( n ) 的值开始小于4 n 2 4n^2 4 n 2 。
p19 例2-2 证明f ( n ) = 10 n 2 + 4 n + 2 = O ( n 2 ) f(n) = 10n^2 + 4n + 2 = O(n^2) f ( n ) = 10 n 2 + 4 n + 2 = O ( n 2 ) 解:n ≥ 2 n\geq 2 n ≥ 2 时,有10 n 2 + 4 n + 2 ≤ 10 n 2 + 5 n 10n^2 + 4n + 2 \leq 10n^2 + 5n 10 n 2 + 4 n + 2 ≤ 10 n 2 + 5 n n ≥ 5 n\geq 5 n ≥ 5 时,有5 n ≤ n 2 5n \leq n^2 5 n ≤ n 2 取n 0 = 5 n_0 = 5 n 0 = 5 ,c = 11 c = 11 c = 11 ,则当n ≥ n 0 n\geq n_0 n ≥ n 0 时,有f ( n ) ≤ 11 n 2 f(n) \leq 11n^2 f ( n ) ≤ 11 n 2 ,所以f ( n ) = O ( n 2 ) f(n) = O(n^2) f ( n ) = O ( n 2 ) .
大Omega记号 n → ∞ n \to \infty n → ∞ 时,f ( n ) f(n) f ( n ) 不会慢于 g ( n ) g(n) g ( n )
如果存在正数c c c 和n 0 n_0 n 0 ,使得当n ≥ n 0 n \geq n_0 n ≥ n 0 时,有f ( n ) ≥ c g ( n ) f(n) \geq cg(n) f ( n ) ≥ c g ( n ) ,则称f ( n ) f(n) f ( n ) 是Ω ( g ( n ) ) \Omega(g(n)) Ω ( g ( n )) 的。c c c 和n 0 n_0 n 0 怎么找?最高次系数不动,小的全放掉 。
p20 例2-6 证明f ( n ) = 10 n 2 + 4 n + 2 = Ω ( n 2 ) f(n) = 10n^2 + 4n + 2 = \Omega(n^2) f ( n ) = 10 n 2 + 4 n + 2 = Ω ( n 2 ) 解: 对所有n n n ,有10 n 2 + 4 n + 2 ≥ 10 n 2 10n^2 + 4n + 2 \geq 10n^2 10 n 2 + 4 n + 2 ≥ 10 n 2 取n 0 = 1 n_0 = 1 n 0 = 1 ,c = 10 c = 10 c = 10 ,则当n ≥ n 0 n\geq n_0 n ≥ n 0 时,有f ( n ) ≥ 10 n 2 f(n) \geq 10n^2 f ( n ) ≥ 10 n 2 ,所以f ( n ) = Ω ( n 2 ) f(n) = \Omega(n^2) f ( n ) = Ω ( n 2 ) .
综合比较两个函数的时间复杂度 基本思路: 如果f ( n ) f(n) f ( n ) 是Ω ( 某个函数 ) \Omega(\text{某个函数}) Ω ( 某个函数 ) 的,同时g ( n ) g(n) g ( n ) 又是O ( 某个函数 ) O(\text{某个函数}) O ( 某个函数 ) 的,那么f ( n ) f(n) f ( n ) 就是Ω ( g ( n ) ) \Omega(g(n)) Ω ( g ( n )) 的。
p29 习题2-11(2) f ( n ) = n 2 / log n f(n)=n^2/\log n f ( n ) = n 2 / log n ,g ( n ) = n log 2 n g(n)=n\log^2 n g ( n ) = n log 2 n 解: (1) 取n 0 = 2 , c = 1 2 n_0 = 2, c=\frac{1}{2} n 0 = 2 , c = 2 1 ,对于所有n ≥ n 0 n\geq n_0 n ≥ n 0 时,有log n ≥ 1 \log n \geq 1 log n ≥ 1 因此 f ( n ) ≥ 1 2 n 2 f(n) \geq \frac{1}{2}n^2 f ( n ) ≥ 2 1 n 2 ,所以f ( n ) = Ω ( n 2 ) f(n) = \Omega(n^2) f ( n ) = Ω ( n 2 ) . (2) 取n 0 = 1 , c = 1 n_0 = 1, c = 1 n 0 = 1 , c = 1 ,对于所有n ≥ n 0 n\geq n_0 n ≥ n 0 时,有log 2 n ≤ n \log^2 n \leq n log 2 n ≤ n 因此 g ( n ) ≤ n ∗ n = n 2 g(n) \leq n*n = n^2 g ( n ) ≤ n ∗ n = n 2 ,所以g ( n ) = O ( n 2 ) g(n) = O(n^2) g ( n ) = O ( n 2 ) . (3) 由(1)和(2)可得f ( n ) = Ω ( g ( n ) ) f(n) = \Omega(g(n)) f ( n ) = Ω ( g ( n )) 。
2.2 迭代法求解时间复杂度 递归时间复杂度求解-迭代法
2.3 主定理求解时间复杂度* 若:
T ( n ) = { c n = 1 a T ( n b ) + c ∗ n k n > 1 T(n) = \left \{
\begin{array}{ll}
c & n = 1 \\
aT(\frac{n}{b}) + c*n^k & n > 1
\end{array}
\right. T ( n ) = { c a T ( b n ) + c ∗ n k n = 1 n > 1
则:
T ( n ) = { Θ ( n log b a ) log b a > k Θ ( n k log n ) log b a = k Θ ( n k ) log b a < k T(n) = \left \{
\begin{array}{ll}
\Theta(n^{\log_b a}) & \log_b a > k \\
\Theta(n^k \log n) & \log_b a = k \\
\Theta(n^k) & \log_b a < k
\end{array}
\right. T ( n ) = ⎩ ⎨ ⎧ Θ ( n l o g b a ) Θ ( n k log n ) Θ ( n k ) log b a > k log b a = k log b a < k
即,谁大要谁(n的指数部分),相等时再乘一个logn
2.4 给一段代码,求时间复杂度 类似408选择题第一题,中间过程写的言之有理即可25考研?那408第一题你已经拿下了。408时间复杂度的几个经典考法
2.4.1 单循环 int i = 0 ;
while (i * i * i <= n)
i ++ ;
T = O ( n 3 ) T = O(\sqrt[3]{n}) T = O ( 3 n )
int i = 1 ;
while (i <= n)
i = i * 2 ;
T = O ( log n ) T = O(\log n) T = O ( log n )
x = 0 ;
while (n >= (x + 1 ) * (x + 1 ))
x ++ ;
T = O ( n ) T = O(\sqrt{n}) T = O ( n )
i = n * n;
while (i != 1 )
i = i / 2 ;
T = O ( log n ) T = O(\log n) T = O ( log n )
2.4.2 两重循环 int m = 0 , i, j;
for (i = 1 ; i <= n; i ++ )
for (j = 1 ; j <= 2 * i; j ++ )
m ++ ;
T = O ( n 2 ) T = O(n^2) T = O ( n 2 )
for (i = 0 ; i < n; i ++ )
for (j = 0 ; j < m; j ++ )
A [i][j] = 0 ;
T = O ( m n ) T = O(mn) T = O ( mn )
count = 0 ;
for (k = 1 ; k <= n; k *= 2 )
for (j = 1 ; j <= n; j ++ )
count ++ ;
T = O ( n log n ) T = O(n \log n) T = O ( n log n )
for (i = n - 1 ; i >= 1 ; i -- )
for (j = 1 ; j < i; j ++ )
if ( A [i] > A [j + 1 ])
swap ( A [i], A [j]);
T = O ( n 2 ) T = O(n^2) T = O ( n 2 )
5.1 基本思想 什么是分治法 详见名词解释
5.2 ~ 5.4 分治法实例 会按照2.1的方式分析时间复杂度,能解释什么是二分搜索、快速排序、合并排序即可。