问题
需要回答的一般性提问,通常包含若干参数
问题描述
定义问题参数(集合,变量,函数,序列等);说明每个参数的取值范围及参数之间的关系;定义问题的解;说明解满足的条件
问题实例
参数的一组赋值可以得到问题的一个实例
算法
有限条指令的序列。这个指令序列确定了解决某个问题的一系列运算或者操作。
算法A解问题P
把问题P的任何实例作为算法A的输入。每步计算是确定性的;A能够在有限步停机;输出该实例的正确的解。
基本运算
比较,加法,乘法,置指针,交换等
e.g.
排序:元素之间的比较;
检索:被检索元素x与数组元素之间的比较;
整数乘法:每位数字相乘一次,m位和n位整数要做mn次位乘;
图的遍历:置指针。
输入规模
输入串编码长度。通常用数组元素多少,调度问题个数,图的顶点数与边数等衡量。
e.g.
排序:数组中元素的个数;
检索:被检索数组的元素个数;
整数乘法:两个整数的位数m,n;
图的遍历:图的顶点数m,边数n。
算法的时间复杂度
针对指定基本运算,计算算法所做的运算次数。
最坏情况下的时间复杂度-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)=i∈S∑Piti
其中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=1∑ninp+(1−p)n其中i是出现的位置,np是相应位置的概率,(1−p)n是未找到的检索次数
b.改进的顺序检索算法
j=1,将x与L[j]比较。若x=L[j],则算法停止,输出j;若x>L[j],则把j加1,继续比较;若x
最坏情况下的比较次数: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=1∑ninp+(1−p)(i=1∑nin+11+nn+11)其中在数组中的检索与前面一致,不在数组中的检索需要分情况讨论。分为x小于L中最大的元素值和x大于L中最大的元素值两种情况。
赋值语句:<-
分支语句:if<条件>then<操作> else
循环语句:while<条件> do;for a<- <起始值> to<最终值> do
转向语句:goto
输出语句:return
用缩进表示嵌套关系
求最大公约数
算法: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
设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 n≥n0,有 0 ≤ f ( n ) ≤ c g ( n ) 0\le f(n) \le cg(n) 0≤f(n)≤cg(n),则称f(n)的渐进的上界是g(n),记做f(n) = O(g(n))。
设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 n≥n0,有 0 ≤ c g ( n ) ≤ f ( n ) 0\le cg(n)\le f(n) 0≤cg(n)≤f(n)则称f(n)的渐进的下界是g(n),记做f(n) = Ω(g(n))。
设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 n≥n0,有 0 ≤ f ( n ) < c g ( n ) 0\le f(n) < cg(n) 0≤f(n)<cg(n),则称f(n)上界是g(n),记做f(n) = o(g(n))。
设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 n≥n0,有 0 ≤ c g ( n ) < f ( n ) 0\le cg(n)< f(n) 0≤cg(n)<f(n),则称f(n)的下界是g(n),记做f(n) = ω(g(n))。
若f(n) = O(g(n)) = Ω(g(n)),则记做f(n) = Θ(g(n))
设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) n→∞limg(n)f(n)=c(c∈N) 那么f(n) = Θ(g(n))
(2)若 lim n → ∞ f ( n ) g ( n ) = 0 \lim_{n\to \infty} \frac{f(n)}{g(n)}=0 n→∞limg(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 n→∞limg(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)=21n2−3n,证明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) 证:n→∞limn2f(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.n→∞limrnnd=0b.n→∞limndlnn=0
函数的阶之间的关系具有传递性:
(1)若f = O(g),g = O(h),则f = O(h)
(2)若f = Ω(g),g = Ω(h),则f = Ω(h)
(3)若f = Θ(g),g = Θ(h),则f = Θ(h)
假设函数f和g的定义域为自然数集,若对某个其他函数h,有f = O(h),g = O(h),则f + g = O(h)。
符号: 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=logl2logln故n→∞limloglnlogn=n→∞limlogl2loglnlogln=logln1b.易知n→∞limnαlogbn=0c.alogbn=nlogba,方程两侧取对数得logalogbn=lognlogba,易知二者相等(换底公式)
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的证明可以由微积分计算函数图像面积,从而得到。
⌈ 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
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 若n∈Z,则⌈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 ⌊b⌊an⌋⌋=⌊abn⌋; ⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \lceil{\frac{\lceil{\frac{n}{a}}\rceil}{b}}\rceil = \lceil\frac{n}{ab}\rceil ⌈b⌈an⌉⌉=⌈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 ⌊b⌊an⌋⌋=⌊abn⌋和 ⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \lceil{\frac{\lceil{\frac{n}{a}}\rceil}{b}}\rceil = \lceil\frac{n}{ab}\rceil ⌈b⌈an⌉⌉=⌈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 (n−2)!、5log(n+100)10、22n、0.0001n4+3n3+1、(lnn)2、n31+logn、3n、log(n!)、log(nn+1)、1+21+⋯+n1
参考答案(答案为笔者自己所做,限于水平,其中存在错误在所难免,欢迎大家指正)
思路:用定义证明
大O符号的定义为:设f,g是定义域为N的函数。若存在正整数c和 n 0 n_0 n0,使得对一切 n ≥ n 0 n\ge n_0 n≥n0,有 0 ≤ f ( n ) ≤ c g ( n ) 0\le f(n) \le cg(n) 0≤f(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) 0≤f(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) 0≤g(n)≤c′h(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) 0≤f(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\\ 上取整同理。 证明⌊b⌊an⌋⌋=⌊abn⌋:an−1<⌊an⌋≤anb⌊an⌋−1<⌊b⌊an⌋⌋≤b⌊an⌋ban−1−1<b⌊an⌋−1<⌊b⌊an⌋⌋≤b⌊an⌋≤anb1ban−1−1<⌊b⌊an⌋⌋≤anb1abn−a−1<⌊b⌊an⌋⌋≤abnabn−1<⌊b⌊an⌋⌋≤abn故由性质a得⌊b⌊an⌋⌋=⌊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)(n−2)!=Θ(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)