算法设计与分析(屈婉玲) Lesson 1 复杂度理论

一.算法及其时间复杂度

1.问题和实例

  • 问题

    需要回答的一般性提问,通常包含若干参数

  • 问题描述

    定义问题参数(集合,变量,函数,序列等);说明每个参数的取值范围及参数之间的关系;定义问题的解;说明解满足的条件

  • 问题实例

    参数的一组赋值可以得到问题的一个实例

2.算法

  • 算法

    有限条指令的序列。这个指令序列确定了解决某个问题的一系列运算或者操作。

  • 算法A解问题P

    把问题P的任何实例作为算法A的输入。每步计算是确定性的;A能够在有限步停机;输出该实例的正确的解。

3.基本运算与输入规模

  • 基本运算

    比较,加法,乘法,置指针,交换等

    e.g.

    排序:元素之间的比较;

    检索:被检索元素x与数组元素之间的比较;

    整数乘法:每位数字相乘一次,m位和n位整数要做mn次位乘;

    图的遍历:置指针。

  • 输入规模

    输入串编码长度。通常用数组元素多少,调度问题个数,图的顶点数与边数等衡量。

    e.g.

    排序:数组中元素的个数;

    检索:被检索数组的元素个数;

    整数乘法:两个整数的位数m,n;

    图的遍历:图的顶点数m,边数n。

  • 算法的时间复杂度

    针对指定基本运算,计算算法所做的运算次数。

4.算法的两种时间复杂度

  • 最坏情况下的时间复杂度-W(n) (worst)

    算法求解输入规模为n的实例所需要的最长时间

  • 平均情况下的时间复杂度-A(n) (average)

    在给定同样规模为n的输入实例的概率分布后,算法求解这些实例所需要的平均时间

  • A(n)计算公式: A ( n ) = ∑ i ∈ S P i t i A(n) = \sum_{i\in S}{P_it_i} A(n)=iSPiti

    其中S为规模为n的实例集,实例 i属于S的概率为 P i P_i Pi,算法对实例 i执行的基本运算次数为 t i t_i ti

  • e.g. 检索

    输入:非降序排列的数组L,元素数n,数x

    输出:j。若j出现在L中,j是首次出现的下标,否则j=0。

    基本运算:x与L中元素的比较

    a.顺序检索算法:

    最坏情况下的比较次数:n次

    平均比较次数:设x在L中的概率为P,且每个位置概率相等,则
    A ( n ) = ∑ i = 1 n i p n + ( 1 − p ) n 其中 i 是出现的位置, p n 是相应位置的概率, ( 1 − p ) n 是未找到的检索次数 A(n) = \sum^n_{i=1}i\frac{p}{n} + (1-p)n\\ 其中i是出现的位置,\frac{p}{n}是相应位置的概率,(1-p)n是未找到的检索次数 A(n)=i=1ninp+(1p)n其中i是出现的位置,np是相应位置的概率,(1p)n是未找到的检索次数
    b.改进的顺序检索算法

    j=1,将x与L[j]比较。若x=L[j],则算法停止,输出j;若x>L[j],则把j加1,继续比较;若x<L[j],停机并输出0

    最坏情况下的比较次数:n次

    平均比较次数:设x在L中的概率为P,且每个位置概率相等,则
    A ( n ) = ∑ i = 1 n i p n + ( 1 − p ) ( ∑ i = 1 n i 1 n + 1 + n 1 n + 1 ) 其中在数组中的检索与前面一致,不在数组中的检索需要分情况讨论。 分为 x 小于 L 中最大的元素值和 x 大于 L 中最大的元素值两种情况。 A(n) = \sum_{i=1}^n i\frac{p}n+(1-p)(\sum_{i=1}^{n} i\frac{1}{n+1}+n\frac 1{n+1})\\ 其中在数组中的检索与前面一致,不在数组中的检索需要分情况讨论。\\ 分为x小于L中最大的元素值和x大于L中最大的元素值两种情况。 A(n)=i=1ninp+(1p)(i=1nin+11+nn+11)其中在数组中的检索与前面一致,不在数组中的检索需要分情况讨论。分为x小于L中最大的元素值和x大于L中最大的元素值两种情况。

二.算法的伪码表示

1.伪码表示

赋值语句:<-

分支语句:if<条件>then<操作> else

循环语句:while<条件> do;for a<- <起始值> to<最终值> do

转向语句:goto

输出语句:return

用缩进表示嵌套关系

2.一些例子

  • 求最大公约数

    算法:Euclid(m,n)

    输入:非负整数m,n,其中m,n不全为0

    输出:m,n的最大公约数

    while m>0 do
    	r<-n mod n
    	n<-m
    	m<-r
    return n
    
  • 插入排序

    算法:InsertSort(A,n)

    输入:n个数的数组A[1…n]

    输出:按照递增顺序排好序的数组A

    for j<-2 to n do
    	x<-A[j]
    	i<-j-1
    	//把A[j]插入到A[1..j-1]中
    	while i>0 and x<A[j] do
    		A[i+1]<-A[i]
    		i<-i-1
    	A[i+1]<-x
    

三.函数的渐进的界

1.大O符号

设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 nn0,有 0 ≤ f ( n ) ≤ c g ( n ) 0\le f(n) \le cg(n) 0f(n)cg(n),则称f(n)的渐进的上界是g(n),记做f(n) = O(g(n))。

  • f(n) = O(g(n)),g(n)的阶大于等于f(n)的阶

2.大Ω符号

设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 nn0,有 0 ≤ c g ( n ) ≤ f ( n ) 0\le cg(n)\le f(n) 0cg(n)f(n)则称f(n)的渐进的下界是g(n),记做f(n) = Ω(g(n))。

  • f(n) = Ω(g(n)),g(n)的阶小于等于f(n)的阶

3.小O符号

设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 nn0,有 0 ≤ f ( n ) < c g ( n ) 0\le f(n) < cg(n) 0f(n)<cg(n),则称f(n)上界是g(n),记做f(n) = o(g(n))。

  • f(n) = o(g(n)),g(n)的阶大于f(n)的阶

4.小ω符号

设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 nn0,有 0 ≤ c g ( n ) < f ( n ) 0\le cg(n)< f(n) 0cg(n)<f(n),则称f(n)的下界是g(n),记做f(n) = ω(g(n))。

  • f(n) = ω(g(n)),g(n)的阶小于f(n)的阶

5.Θ符号

若f(n) = O(g(n)) = Ω(g(n)),则记做f(n) = Θ(g(n))

  • f(n) = Θ(g(n)),g(n)的阶等于f(n)的阶

四.有关函数渐进的界的定理

1.定理1

设f和g都是定义域为自然数集合的函数

(1)若 lim ⁡ n → ∞ f ( n ) g ( n ) = c ( c ∈ N ) \lim_{n\to \infty} \frac{f(n)}{g(n)} = c(c\in N) nlimg(n)f(n)=c(cN) 那么f(n) = Θ(g(n))

(2)若 lim ⁡ n → ∞ f ( n ) g ( n ) = 0 \lim_{n\to \infty} \frac{f(n)}{g(n)}=0 nlimg(n)f(n)=0,那么f(n) = o(g(n))

(3)若 lim ⁡ n → ∞ f ( n ) g ( n ) = + ∞ \lim_{n\to \infty} \frac{f(n)}{g(n)}=+\infty nlimg(n)f(n)=+,那么f(n) = ω(g(n))

  • 证明:主观上可以从函数的阶的角度来理解。严格证明使用极限定义和几种函数符号的定义即可。

  • e.g.

    f ( n ) = 1 2 n 2 − 3 n f(n) = \frac{1}{2} n^2 -3n f(n)=21n23n,证明f(n) = Θ( n 2 n^2 n2)
    证: lim ⁡ n → ∞ f ( n ) n 2 = 1 2 , 根据定理 1 ,有 f ( n ) = Θ ( n 2 ) 证:\lim_{n\to\infty}\frac{f(n)}{n^2} = \frac12,根据定理1,有f(n) = Θ(n^2) 证:nlimn2f(n)=21,根据定理1,有f(n)=Θ(n2)

  • 一些重要结果

    a.多项式函数的阶低于指数函数的阶,即 n d = o ( r n ) n^d = o(r^n) nd=o(rn)

    b.对数函数的阶低于多项式函数的阶,即 ln ⁡ n = o ( n d ) \ln n =o(n^d) lnn=o(nd)
    证明 : a . lim ⁡ n → ∞ n d r n = 0 b . lim ⁡ n → ∞ ln ⁡ n n d = 0 \begin{align}\notag 证明:a.\lim_{n\to\infty}\frac{n^d}{r^n} = 0\\\notag b.\lim_{n\to\infty}\frac{\ln n}{n^d} =0\notag \end{align} 证明:a.nlimrnnd=0b.nlimndlnn=0

2.定理2

函数的阶之间的关系具有传递性:

(1)若f = O(g),g = O(h),则f = O(h)

(2)若f = Ω(g),g = Ω(h),则f = Ω(h)

(3)若f = Θ(g),g = Θ(h),则f = Θ(h)

3.定理3

假设函数f和g的定义域为自然数集,若对某个其他函数h,有f = O(h),g = O(h),则f + g = O(h)。

  • 因此,若算法由有限步骤组成,若每一步的时间复杂度都为O(h),那么该算法的时间复杂度可以写为O(h).

五.几类重要的函数

1.基本函数类

  • 按照阶的高低排序:指数级( 2 n 2^n 2n , n ! . . ) ;多项式级 ( n , ,n!..);多项式级(n, ,n!..);多项式级(n,n^2 , , , n log ⁡ n n\log n nlogn, n 1 2 n^{\frac12} n21 ) ;对数级 ( );对数级( );对数级( log ⁡ n \log n logn, log ⁡ 2 n {\log^2 n} log2n, log ⁡ log ⁡ n \log \log n loglogn)

2.对数函数

  • 符号: log ⁡ n = log ⁡ 2 n \log n = \log_2 n logn=log2n ; ; log ⁡ log ⁡ n = log ⁡ ( log ⁡ n ) \log \log n = \log(\log n) loglogn=log(logn)

  • 性质

    a. log ⁡ n = Θ ( log ⁡ l n ) \log n = Θ(\log_l n) logn=Θ(logln),即对数式的阶与底数无关

    b. log ⁡ b n = o ( n α ) \log _b n = o(n^\alpha) logbn=o(nα),即对数式的阶数小于多项式的阶数

    c. a log ⁡ b n = n log ⁡ b a a^{\log_b n} = {n^{\log_b a}} alogbn=nlogba
    证 : a . 因为 log ⁡ n = log ⁡ l n log ⁡ l 2 故 lim ⁡ n → ∞ log ⁡ n log ⁡ l n = lim ⁡ n → ∞ log ⁡ l n log ⁡ l 2 log ⁡ l n = 1 log ⁡ l n b . 易知 lim ⁡ n → ∞ log ⁡ b n n α = 0 c . a log ⁡ b n = n log ⁡ b a , 方程两侧取对数得 log ⁡ a log ⁡ b n = log ⁡ n log ⁡ b a , 易知二者相等 ( 换底公式 ) 证: a.因为\log n = \frac{\log_ln}{\log_l 2}\\ 故\lim_{n\to\infty}\frac{\log{n}}{\log_ln} = \lim_{n\to\infty}\frac{\log_ln}{\log_l2 \log_ln} = \frac{1}{\log_ln}\\ \\ b.易知\lim_{n\to\infty}\frac{\log_bn}{n^\alpha} = 0\\ \\ c.a^{\log_b n} = n^{\log_b a} ,方程两侧取对数得\\ \log a\log_bn=\log n\log_b a,易知二者相等(换底公式) :a.因为logn=logl2loglnnlimloglnlogn=nlimlogl2loglnlogln=logln1b.易知nlimnαlogbn=0c.alogbn=nlogba,方程两侧取对数得logalogbn=lognlogba,易知二者相等(换底公式)

3.指数函数

  • n! = o( n n n^n nn) = ω( 2 n 2^n 2n)

  • log ⁡ ( n ! ) \log(n!) log(n!) = Θ( n log ⁡ n n\log n nlogn)

    结论1的证明由Stirling公式直接得到;结论2的证明可以由微积分计算函数图像面积,从而得到。

4.取整函数

⌈ x ⌉ \lceil x\rceil x:上取整 ( e . g . ⌈ 2.6 ⌉ = 3 e.g. \lceil 2.6\rceil = 3 e.g.2.6=3)

⌊ x ⌋ \lfloor x \rfloor x:下取整 ( e . g . ⌊ 2.6 ⌋ = 2 e.g. \lfloor 2.6\rfloor = 2 e.g.2.6=2)

  • 取整函数的性质

    a. x − 1 < ⌊ x ⌋ ≤ x ≤ ⌈ x ⌉ < x + 1 x-1<\lfloor x\rfloor\le x\le\lceil x \rceil <x+1 x1<xxx<x+1

    b. 若 n ∈ Z , 则 ⌈ x + n ⌉ = ⌈ x ⌉ + n ; ⌊ x + n ⌋ = ⌊ x ⌋ + n 若n\in Z,则\lceil x+n \rceil = \lceil x\rceil + n;\lfloor x+n \rfloor = \lfloor x\rfloor + n nZ,x+n=x+n;x+n=x+n

    c. ⌈ n 2 ⌉ + ⌊ n 2 ⌋ = n \lceil \frac{n}{2}\rceil + \lfloor\frac{n}{2}\rfloor = n 2n+2n=n

    d. ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor = \lfloor\frac{n}{ab}\rfloor ban=abn ⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \lceil{\frac{\lceil{\frac{n}{a}}\rceil}{b}}\rceil = \lceil\frac{n}{ab}\rceil ban=abn

六.习题

假设f和g是定义在自然数集合上的函数,若对某个函数h有f = O(h)以及g = O(h)成立,证明f+g = O(h)

证明 ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor = \lfloor\frac{n}{ab}\rfloor ban=abn ⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \lceil{\frac{\lceil{\frac{n}{a}}\rceil}{b}}\rceil = \lceil\frac{n}{ab}\rceil ban=abn

对于下面的每个函数,用Θ符号表示成f = Θ(g(n))的形式,其中g(n)要尽可能简洁。比如 f ( n ) = n 2 + 2 n + 3 f(n) = n^2+2n+3 f(n)=n2+2n+3要写成 f ( n ) = Θ ( n 2 ) f(n) = Θ(n^2) f(n)=Θ(n2)的形式。然后按照递增的顺序对这些函数进行排序:

( n − 2 ) ! 、 5 log ⁡ ( n + 100 ) 10 、 2 2 n 、 0.0001 n 4 + 3 n 3 + 1 、 ( ln ⁡ n ) 2 、 n 1 3 + log ⁡ n 、 3 n 、 log ⁡ ( n ! ) 、 log ⁡ ( n n + 1 ) 、 1 + 1 2 + ⋯ + 1 n (n-2)!、5\log (n+100)^{10}、2^{2n}、0.0001n^4+3n^3+1、(\ln n )^2、n^{\frac13}+\log n 、3^n、\log(n!)、\log(n^{n+1})、1+\frac12+\dots+\frac1n (n2)!5log(n+100)1022n0.0001n4+3n3+1(lnn)2n31+logn3nlog(n!)log(nn+1)1+21++n1


参考答案(答案为笔者自己所做,限于水平,其中存在错误在所难免,欢迎大家指正)

思路:用定义证明

大O符号的定义为:设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 nn0,有 0 ≤ f ( n ) ≤ c g ( n ) 0\le f(n) \le cg(n) 0f(n)cg(n),则称f(n)的渐进的上界是g(n),记做f(n) = O(g(n))。

故当 n > n 0 n>n_0 n>n0时,存在正整数 c c c,使得 0 ≤ f ( n ) ≤ c h ( n ) 0\le f(n) \le ch(n) 0f(n)ch(n)

n > n 1 n>n_1 n>n1,存在正整数 c ′ c' c 0 ≤ g ( n ) ≤ c ′ h ( n ) 0\le g(n) \le c'h(n) 0g(n)ch(n)

将上述两式相加,当n>max{ n 0 , n 1 n_0,n_1 n0,n1}时,有 0 ≤ f ( n ) + g ( n ) ≤ ( c + c ′ ) h ( n ) 0\le f(n) + g(n)\le (c+c')h(n) 0f(n)+g(n)(c+c)h(n),故f+g = O(h)。

思路:取整函数的性质a,层层去除取整符号
证明 ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ : n a − 1 < ⌊ n a ⌋ ≤ n a ⌊ n a ⌋ b − 1 < ⌊ ⌊ n a ⌋ b ⌋ ≤ ⌊ n a ⌋ b n a − 1 b − 1 < ⌊ n a ⌋ b − 1 < ⌊ ⌊ n a ⌋ b ⌋ ≤ ⌊ n a ⌋ b ≤ n a 1 b n a − 1 b − 1 < ⌊ ⌊ n a ⌋ b ⌋ ≤ n a 1 b n − a a b − 1 < ⌊ ⌊ n a ⌋ b ⌋ ≤ n a b n a b − 1 < ⌊ ⌊ n a ⌋ b ⌋ ≤ n a b 故由性质 a 得 ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ 上取整同理。 证明\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor = \lfloor\frac{n}{ab}\rfloor:\\ \frac na-1<\lfloor{\frac{n}{a}}\rfloor\le\frac{n}{a}\\ {\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}-1<\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor\le{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\\ \frac{\frac na-1}{b}-1<{\frac{\lfloor{\frac{n}{a}}\rfloor} {b}}-1<\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor\le{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\le \frac na \frac1b\\ \frac{\frac na-1}{b}-1<\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor\le\frac na \frac1b\\ \frac{n-a}{ab}-1<\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor\le\frac n{ab}\\ \frac{n}{ab}-1<\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor\le\frac n{ab}\\ 故由性质a得\lfloor{\frac{\lfloor{\frac{n}{a}}\rfloor}{b}}\rfloor = \lfloor\frac{n}{ab}\rfloor\\ 上取整同理。 证明ban=abn:an1<ananban1<banbanban11<ban1<banbananb1ban11<bananb1abna1<banabnabn1<banabn故由性质aban=abn上取整同理。
3.
( 1 ) ( n − 2 ) ! = Θ ( n ! ) ( 2 ) 5 log ⁡ ( n + 100 ) 10 = Θ ( log ⁡ n ) ( 3 ) 2 2 n = Θ ( 4 n ) ( 4 ) 0.0001 n 4 + 3 n 3 + 1 = Θ ( n 4 ) ( 5 ) ( ln ⁡ n ) 2 = Θ ( log ⁡ 2 n ) ( 6 ) n 1 3 + log ⁡ n = Θ ( n 1 3 ) ( 7 ) 3 n = Θ ( 3 n ) ( 8 ) log ⁡ ( n ! ) = Θ ( n log ⁡ n ) ( 9 ) log ⁡ ( n n + 1 ) = Θ ( n l o g n ) ( 对数加法公式 ) ( 10 ) 1 + 1 2 + ⋯ + 1 n = ln ⁡ ( n + 1 ) + γ ( 调和级数求和公式 , γ 为欧拉常数 ) = Θ ( log ⁡ n ) \begin{align}\notag &(1)(n-2)! = Θ(n!)\\\notag &(2)5\log (n+100)^{10} = Θ(\log n)\\\notag &(3)2^{2n} = Θ(4^n)\\\notag &(4)0.0001n^4+3n^3+1 = Θ(n^4)\\\notag &(5)(\ln n )^2 = Θ(\log^2n)\\\notag &(6)n^{\frac13}+\log n =Θ(n^\frac13)\\\notag &(7)3^n =Θ(3^n) \\\notag &(8)\log(n!) = Θ(n\log n)\\\notag &(9)\log(n^{n+1}) = Θ(nlogn) (对数加法公式)\\\notag &(10)1+\frac12+\dots+\frac1n = \ln(n+1)+γ\\\notag &(调和级数求和公式,γ为欧拉常数) \\\notag &=Θ(\log n ) \end{align} (1)(n2)!=Θ(n!)(2)5log(n+100)10=Θ(logn)(3)22n=Θ(4n)(4)0.0001n4+3n3+1=Θ(n4)(5)(lnn)2=Θ(log2n)(6)n31+logn=Θ(n31)(7)3n=Θ(3n)(8)log(n!)=Θ(nlogn)(9)log(nn+1)=Θ(nlogn)(对数加法公式)(10)1+21++n1=ln(n+1)+γ(调和级数求和公式,γ为欧拉常数)=Θ(logn)
因此,以序号排列,阶数从小到大依次为(10)=(2),(5),(6),(8)=(9),(4),(7),(3),(1)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值