算法设计与分析(陈慧南)Ch1~5

算法设计与分析(陈慧南)Ch1~5

创建于 2025-03-16·更改于 2025-03-25

第一~五章 算法基础、时间复杂度、分治法

1.x 算法概述

算法五个特征 详见名词解释

2.1 渐进表示法

大O记号

nn \to \infty 时,f(n)f(n) 不会快于 g(n)g(n)

如果存在正数ccn0n_0,使得当nn0n \geq n_0时,有f(n)cg(n)f(n) \leq cg(n),则称f(n)f(n)O(g(n))O(g(n))的。
ccn0n_0怎么找?系数加一
简单地说,如果f(n)f(n)最高项为一次项(例如3n+23n+2),那么就把常数项放掉,看nn等于几时f(n)f(n)的值开始小于4n4n
如果f(n)f(n)既有一次项又有二次项(例如3n2+2n+13n^2+2n+1),那么首先把常数项放掉,看nn等于几时f(n)f(n)的值开始小于3n2+3n3n^2+3n再把一次项放掉,看nn等于几时f(n)f(n)的值开始小于4n24n^2

p19 例2-2 证明f(n)=10n2+4n+2=O(n2)f(n) = 10n^2 + 4n + 2 = O(n^2)
解:
n2n\geq 2时,有10n2+4n+210n2+5n10n^2 + 4n + 2 \leq 10n^2 + 5n
n5n\geq 5时,有5nn25n \leq n^2
n0=5n_0 = 5c=11c = 11,则当nn0n\geq n_0时,有f(n)11n2f(n) \leq 11n^2,所以f(n)=O(n2)f(n) = O(n^2).

大Omega记号

nn \to \infty 时,f(n)f(n) 不会慢于 g(n)g(n)

如果存在正数ccn0n_0,使得当nn0n \geq n_0时,有f(n)cg(n)f(n) \geq cg(n),则称f(n)f(n)Ω(g(n))\Omega(g(n))的。
ccn0n_0怎么找?最高次系数不动,小的全放掉

p20 例2-6 证明f(n)=10n2+4n+2=Ω(n2)f(n) = 10n^2 + 4n + 2 = \Omega(n^2)
解:
对所有nn,有10n2+4n+210n210n^2 + 4n + 2 \geq 10n^2
n0=1n_0 = 1c=10c = 10,则当nn0n\geq n_0时,有f(n)10n2f(n) \geq 10n^2,所以f(n)=Ω(n2)f(n) = \Omega(n^2).

综合比较两个函数的时间复杂度

基本思路: 如果f(n)f(n)Ω(某个函数)\Omega(\text{某个函数})的,同时g(n)g(n)又是O(某个函数)O(\text{某个函数})的,那么f(n)f(n)就是Ω(g(n))\Omega(g(n))的。

p29 习题2-11(2) f(n)=n2/lognf(n)=n^2/\log ng(n)=nlog2ng(n)=n\log^2 n
解:
(1) 取n0=2,c=12n_0 = 2, c=\frac{1}{2},对于所有nn0n\geq n_0时,有logn1\log n \geq 1
因此 f(n)12n2f(n) \geq \frac{1}{2}n^2,所以f(n)=Ω(n2)f(n) = \Omega(n^2).
(2) 取n0=1,c=1n_0 = 1, c = 1,对于所有nn0n\geq n_0时,有log2nn\log^2 n \leq n
因此 g(n)nn=n2g(n) \leq n*n = n^2,所以g(n)=O(n2)g(n) = O(n^2).
(3) 由(1)和(2)可得f(n)=Ω(g(n))f(n) = \Omega(g(n))

2.2 迭代法求解时间复杂度

递归时间复杂度求解-迭代法

2.3 主定理求解时间复杂度*

若:

T(n)={cn=1aT(nb)+cnkn>1T(n) = \left \{ \begin{array}{ll} c & n = 1 \\ aT(\frac{n}{b}) + c*n^k & n > 1 \end{array} \right.

则:

T(n)={Θ(nlogba)logba>kΘ(nklogn)logba=kΘ(nk)logba<kT(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.

即,谁大要谁(n的指数部分),相等时再乘一个logn

2.4 给一段代码,求时间复杂度

类似408选择题第一题,中间过程写的言之有理即可
25考研?那408第一题你已经拿下了。408时间复杂度的几个经典考法

2.4.1 单循环

int i=0;
while (i*i*i <= n)
    i++;

T=O(n3)T = O(\sqrt[3]{n})

int i=1;
while (i<=n)
    i = i * 2;

T=O(logn) T = O(\log n)

x=0;
while (n >= (x+1)*(x+1))
    x++;

T=O(n) T = O(\sqrt{n})

i = n*n;
while (i != 1)
    i = i / 2;

T=O(logn)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(n2)T = O(n^2)

for (i=0; i<n; i++)
    for (j=0; j<m; j++)
        A[i][j] = 0;

T=O(mn)T = O(mn)

count = 0;
for (k=1; k<=n; k*=2)
    for (j=1; j<=n; j++)
        count++;

T=O(nlogn)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(n2)T = O(n^2)

5.1 基本思想

什么是分治法 详见名词解释

5.2 ~ 5.4 分治法实例

会按照2.1的方式分析时间复杂度,能解释什么是二分搜索、快速排序、合并排序即可。

fin

版权声明

① 本博客所有原创文章,除非另有特别声明,均采用CC BY-NC-SA 4.0/知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行授权。

② 本博客中,在文章内容之外使用的原创图片、动画、音频等多媒体素材的知识产权归属如下:
(i) 由博客作者独立创作的素材,其知识产权由博客作者单独所有;
(ii) 与他人合作创作的素材,其知识产权由博客作者与原创作者共同所有;
(iii) 对于特定素材,如有不同的版权归属,将在相应位置特别注明。
未经原作者或博客作者的明确授权,任何个人或组织不得在其他场合使用、复制、修改或传播这些素材。