我是靠谱客的博主 孤独蜡烛,最近开发中收集的这篇文章主要介绍《算法导论》练习与思考题第1-3章 (python版)第一章 算法在计算中的作用第二章 算法基础第三章 函数的增长,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 第一章 算法在计算中的作用
    • 练习
      • 1.1 算法
        • 1.1-1
        • 1.1-2
        • 1.1-3
        • 1.1-4
        • 1.1-5
      • 1.2 作为一种技术的算法
        • 1.2-1
        • 1.2-2
        • 1.2-3
    • 思考题
      • 1-1 运行时间的比较
  • 第二章 算法基础
    • 练习
      • 2.1 插入排序
        • 2.1-1
        • 2.1-2
        • 2.1-3
        • 2.1-4
      • 2.2 分析算法
        • 2.2-1
        • 2.2-2
        • 2.2-3
        • 2.2-4
      • 2.3 设计算法
        • 2.3-1
        • 2.3-2
        • 2.3-3
        • 2.3-4
        • 2.3-5
        • 2.3-6
        • 2.3-7
    • 思考题
      • 2-1
      • 2-2
      • 2-3
      • 2-4
  • 第三章 函数的增长
    • 练习
      • 3.1 渐进记号
        • 3.1-1
        • 3.1-2
        • 3.1-3
        • 3.1-4
        • 3.1-5
        • 3.1-6
        • 3.1-7
        • 3.1-8
      • 3.2 标准记号与常用函数
        • 3.2-1
        • 3.2-2
        • 3.2-3
        • 3.2-6
        • 3.2-7
        • 3.2-8
    • 思考题
      • 3-1 多项式的渐进行为
      • 3-2 相对渐进增长
      • 3-3 根据渐进增长率排序
      • 3-4 渐进记号的性质
      • 3-5 O O O Ω Omega Ω的一些变形
      • 3-6 多重函数

第一章 算法在计算中的作用

练习

1.1 算法

1.1-1

排序的例子:一个医生要接诊的病人会按照挂号时间排序。

1.1-2

热效率,衡量发动机等热能转换装置能量利用的效率

1.1-3

数据结构:链表
优势:顺序访问效率高
局限:随机访问效率低

1.1-4

相似之处:都是点与点之间的移动;都是求最短的移动路线
不同:最短路径问题有明确的解法,而旅行商问题是NP完全问题,没有有效算法。

1.1-5

必须是最佳解的例子:一个数学定理的证明
可以使用近似解的例子:手术方案的建立

1.2 作为一种技术的算法

1.2-1

应用层的例子:一个压缩软件,在应用层就会使用压缩算法。
算法的功能:应该将输入的数据无损地转换为更小的数据

1.2-2

当n的取值为2-6时插入排序优于归并排序

1.2-3

n最小为15时在同一台机器上 100 n 2 100n^2 100n2的算法优于 2 n 2^n 2n的算法

思考题

1-1 运行时间的比较

思路:先将给定时间转换为毫秒,然后用 f ( n ) f(n) f(n)的逆函数求出对应的n值

1秒钟(1000ms)1分钟(60000ms)1小时(3600000ms)1天(86400000ms)1月(2592000000ms)1年(31536000000ms)1世纪(3153600000000ms)
lg ⁡ n lg{n} lgn 1 0 1000 10^{1000} 101000 1 0 60000 10^{60000} 1060000 1 0 3600000 10^{3600000} 103600000 1 0 86400000 10^{86400000} 1086400000 1 0 2592000000 10^{2592000000} 102592000000 1 0 31536000000 10^{31536000000} 1031536000000 1 0 3153600000000 10^{3153600000000} 103153600000000
n sqrt{n} n 100 0 2 1000^{2} 10002 6000 0 2 60000^{2} 600002 360000 0 2 3600000^{2} 36000002 8640000 0 2 86400000^{2} 864000002 259200000 0 2 2592000000^{2} 25920000002 3153600000 0 2 31536000000^{2} 315360000002 315360000000 0 2 3153600000000^{2} 31536000000002
n n n 1000 1000 1000 60000 60000 60000 3600000 3600000 3600000 86400000 86400000 86400000 2592000000 2592000000 2592000000 31536000000 31536000000 31536000000 3153600000000 3153600000000 3153600000000
n 2 n^2 n2 31 31 31 244 244 244 1897 1897 1897 9295 9295 9295 50911 50911 50911 177583 177583 177583 1 , 775 , 837 1,775,837 1,775,837
n 3 n^3 n3 10 10 10 39 39 39 153 153 153 442 442 442 1373 1373 1373 3159 3159 3159 14 , 664 14,664 14,664
2 n 2^n 2n 9 9 9 15 15 15 21 21 21 26 26 26 31 31 31 34 34 34 41 41 41
n ! n! n! 6 6 6 8 8 8 9 9 9 11 11 11 12 12 12 13 13 13 15 15 15

第二章 算法基础

练习

2.1 插入排序

2.1-1

用画图绘制的插入排序过程

2.1-2

def insertionSortNonAscending(A):
	for j in range(1,len(A)):
		key = A[j]
		i = j - 1
		while i >=0 and A[i] < key:
			A[i+1] = A[i]
			i -= 1
		A[i+1] = key

2.1-3

def linearFind(A, v):
	for j in range(len(A)):
		if A[j] == v:
			return j
	return None

循环不变式:已经搜索的子数组A[0…j-1]中不存在v

  • 初始化:迭代开始之前(当0=1时)子数组A[0…j-1]中一个元素也没有,循环不变式成立
  • 保持:如果A[j]等于v,循环终止。反之A[0…j]中不存在v,循环不变式成立
  • 终止:当j等于A.length时循环终止,此时已经搜索的子数组A[0…j-1]即原数组A[0…n]。而如果在循环中A[j]等于v时循环终止,此时前一次迭代已经搜索的子数组A[0…j-1]中没有v,循环不变式成立

2.1-4

二进制加法问题:
     输入:n个数的两个序列, A = < a 1 , a 2 , ⋯   , a n > A=<a_1,a_2,cdots,a_n> A=<a1,a2,,an> B = < b 1 , b 2 , ⋯   , b n > B=<b_1,b_2,cdots,b_n> B=<b1,b2,,bn>,A和B表示两个二进制数每个数位的依次排列
     输出: n+1个数的序列 C = < c 1 , c 2 , ⋯   , c n + 1 > C=<c_1,c_2,cdots,c_{n+1}> C=<c1,c2,,cn+1>,C为二进制数A与B的和

def binarySum(A, B):
	carry = 0
	C = []
	for i in range(len(A)-1,-1,-1):
		sum = A[i] + B[i] + carry
		C.insert(0, sum % 2)
		carry = sum // 2 
	C.insert(0, carry)
	return C

2.2 分析算法

2.2-1

Θ ( n 3 ) Theta(n^3) Θ(n3)

2.2-2

def selectionSort(A):
	for i in range(len(A)-1):
		min = i
		for j in range(i+1,len(A)):
			if A[min] > A[j]:
				min = j
		A[min],A[i]=A[i],A[min]

循环不变式:A[0…i-1]为已排序好的序列
考虑最后一次循环,此时i=n-1,A[1…n-2]为已排序的序列且都小于A[n-1]和A[n],当将A[n]和A[n-1]中最小的放到A[n-1]处时,A[n]处的数据也回到了正确的位置,所以只循环n-1次就足够。
最好情况和最坏情况都是 Θ ( n 2 ) Theta(n^2) Θ(n2)的运行时间

2.2-3

平均情况和最坏情况运行时间均为 Θ ( n ) Theta(n) Θ(n)
证明:
平均情况时,假设v有n+1种情况,v等可能的出现在A中任一位置或者不出现。
所以平均的运行时间为 1 + 2 + ⋯ + n n + 1 = 1 2 n ( n + 1 ) n + 1 = 1 2 n = Θ ( n ) cfrac{1+2+cdots+n}{n+1}=cfrac{frac{1}{2}n(n+1)}{n+1}=frac{1}{2}n=Theta(n) n+11+2++n=n+121n(n+1)=21n=Θ(n)
最坏情况时不出现,总共循环比较n次,运行时间为 Θ ( n ) Theta(n) Θ(n)

2.2-4

???不太确定题的意思
大概是保证最好情况时循环能够直接结束程序给出答案吧。

2.3 设计算法

2.3-1

用画图绘制的归并排序过程

2.3-2

def merge(arr, p, q, r):
    n1 = q - p + 1
    n2 = r - q
    L = arr[p:q + 1]
    R = arr[q + 1:r + 1]
    i = j = 0
    k = p
    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
        k += 1
    while i < n1:
        arr[k] = L[i]
        k += 1
        i += 1
    while j < n2:
        arr[k] = R[j]
        k += 1
        j += 1

2.3-3

首先:当k=1时 n = 2 k = 2 n=2^k=2 n=2k=2 T ( n ) = T ( 2 ) = 2 , n lg ⁡ n = 2 T(n)=T(2)=2,nlg n=2 T(n)=T(2)=2,nlgn=2,所以 T ( n ) = n lg ⁡ n T(n)=nlg n T(n)=nlgn
假设:k=m时等式成立, n = 2 m , T ( n ) = n lg ⁡ n = m 2 m n=2^m,T(n)=nlg n=m2^m n=2m,T(n)=nlgn=m2m。因此k=m+1时将 n = 2 m + 1 n=2^{m+1} n=2m+1带入 T ( n ) = 2 T ( n 2 ) + n T(n)=2T(cfrac{n}{2})+n T(n)=2T(2n)+n中,得 T ( n ) = 2 T ( 2 m ) + 2 m + 1 = m 2 m + 1 + 2 m + 1 = ( m + 1 ) 2 m + 1 T(n)=2T(2^m)+2^{m+1}=m2^{m+1}+2^{m+1}=(m+1)2^{m+1} T(n)=2T(2m)+2m+1=m2m+1+2m+1=(m+1)2m+1,而 n lg ⁡ n = 2 m + 1 lg ⁡ ( 2 m + 1 ) = ( m + 1 ) 2 m + 1 nlg n= 2^{m+1}lg(2^{m+1})=(m+1)2^{m+1} nlgn=2m+1lg(2m+1)=(m+1)2m+1,所以 T ( n ) = n lg ⁡ n T(n)=nlg n T(n)=nlgn成立
综上所述,当n刚好是2的幂时,本题递归式的解为 T ( n ) = n lg ⁡ n T(n)=nlg n T(n)=nlgn

2.3-4

T ( n ) = { Θ ( 1 ) , n = 1 T ( n − 1 ) + Θ ( n ) , n > 1 T(n)= begin{cases} Theta(1) ,&n=1\ T(n-1) +Theta(n),&n>1 end{cases} T(n)={Θ(1),T(n1)+Θ(n),n=1n>1

2.3-5

def binaryFind(A, v, p, q):
    if p <= q:
        r = (p + q) // 2
        if A[r] == v:
            return r
        elif A[r] < v:
            return binaryFind(A, v, r + 1, q)
        else:
            return binaryFind(A, v, p, r - 1)
    else:
        return None

最坏情况下,有如下递归式:
T ( n ) = { Θ ( 1 ) , n = 1 T ( n 2 ) + Θ ( 1 ) , n > 1 T(n)= begin{cases} Theta(1) ,&n=1\ T(cfrac{n}{2}) +Theta(1),&n>1 end{cases} T(n)=Θ(1),T(2n)+Θ(1),n=1n>1
显然有:
lg ⁡ n { T ( n ) − T ( n 2 ) = Θ ( 1 ) T ( n 2 ) − T ( n 2 2 ) = Θ ( 1 ) T ( n 2 2 ) − T ( n 2 3 ) = Θ ( 1 ) ⋯ ⋯ T ( 2 ) − T ( 1 ) = Θ ( 1 ) lg n begin{cases} T(n)-T(cfrac{n}{2})=Theta(1)\ T(cfrac{n}{2})-T(cfrac{n}{2^2})=Theta(1)\ T(cfrac{n}{2^2})-T(cfrac{n}{2^3})=Theta(1)\ cdotscdots\ T(2)-T(1)=Theta(1) end{cases} lgnT(n)T(2n)=Θ(1)T(2n)T(22n)=Θ(1)T(22n)T(23n)=Θ(1)T(2)T(1)=Θ(1)
所以最坏情况的运行时间为 Θ ( lg ⁡ n ) Theta(lg n) Θ(lgn)

2.3-6

不能,2.1节中INSERTION-SORT的while循环同时起到两个作用:找到已排序的n个数中要插入的位置和将该位置之后的元素向后移动一位,运行时间是 Θ ( n ) Theta(n) Θ(n)。最坏情况时,找到位置的需求可以使用二分查找来降低运行时间为 Θ ( lg ⁡ n ) Theta(lg n) Θ(lgn),但移动元素的运行时间还是 Θ ( n ) Theta(n) Θ(n),所以while循环的运行时间无法通过使用二分查找降低至 Θ ( lg ⁡ n ) Theta(lg n) Θ(lgn),所以最坏情况运行时间也无法使用二分查找改进到 Θ ( n lg ⁡ n ) Theta(nlg n) Θ(nlgn)的运行时间。

2.3-7

使用归并排序将集合的元素排序,时间复杂度为 Θ ( n lg ⁡ n ) Theta(nlg n) Θ(nlgn),假设排好序的元素组成序列 A = < a 1 , a 2 , ⋯   , a n > A=<a_1,a_2,cdots,a_n> A=<a1,a2,,an>,其中 a 1 ⩽ a 2 ⩽ ⋯ ⩽ a n a_1leqslant a_2leqslantcdotsleqslant a_n a1a2an。从数列两端遍历,让left= a 1 a_1 a1,right= a n a_n an,考虑left+right和x的关系。假设此时left= a l a_l al,right= a r a_r ar
如果left+right==x,说明正好找到了题目要求的两个数。
如果left+right>x,那么right右边的所有数 a r ′ a_{r'} ar都有left + a r ′ > +a_{r'}> +ar>left + a r > +a_{r}> +ar>x。此时将right左移一位,重新判断。
如果left+right<x,那么left左边的所有数 a l ′ a_{l'} al都有 a l ′ + a_{l'}+ al+right > a l >a_{l} >al+right > > >x。此时将left右移一位,重新判断。
当left和right重叠时说明已经找遍了可能产生x的两个数的组合。
可以看出,最好情况一次找到时间复杂度为 Θ ( 1 ) Theta(1) Θ(1),最坏情况会遍历一遍排序完的序列,时间复杂度为 Θ ( 1 ) × n = Θ ( n ) Theta(1)times n=Theta(n) Θ(1)×n=Θ(n),但无论什么情况显然远远小于 Θ ( n lg ⁡ n ) Theta(nlg n) Θ(nlgn)的排序时间,所以该算法的时间复杂度为 Θ ( n lg ⁡ n ) Theta(nlg n) Θ(nlgn)

思考题

2-1

a.插入排序n个元素的最坏情况时间复杂度为 Θ ( n 2 ) Theta(n^2) Θ(n2)。所以 n k cfrac{n}{k} kn个子表插入排序的时间复杂度为 Θ ( k 2 ) × n k = Θ ( n k ) Theta(k^2)timescfrac{n}{k}=Theta(nk) Θ(k2)×kn=Θ(nk)

b.归并两个长度为k的子表时间复杂度为 Θ ( k ) Theta(k) Θ(k),归并 n k cfrac{n}{k} kn个子表时间复杂度为 Θ ( k ) × Θ ( n k ) = Θ ( n ) Theta(k)timesTheta(cfrac{n}{k})=Theta(n) Θ(k)×Θ(kn)=Θ(n),可知每轮归并时间复杂度为 Θ ( n ) Theta(n) Θ(n) n k cfrac{n}{k} kn个子表需要归并 Θ ( lg ⁡ ( n k ) ) Theta(lg(cfrac{n}{k})) Θ(lg(kn))轮,所以合并子表最坏情况时间复杂度为 Θ ( n ) × Θ ( lg ⁡ ( n k ) ) = Θ ( n lg ⁡ ( n k ) ) Theta(n)timesTheta(lg(cfrac{n}{k}))=Theta(nlg(cfrac{n}{k})) Θ(n)×Θ(lg(kn))=Θ(nlg(kn))

c.有等式 Θ ( n k + n lg ⁡ ( n k ) ) = Θ ( n lg ⁡ n ) Theta(nk+nlg(cfrac{n}{k}))=Theta(nlg n) Θ(nk+nlg(kn))=Θ(nlgn)。根据 Θ Theta Θ记号的性质,当 k > lg ⁡ n k>lg n k>lgn时,有 Θ ( n k + n lg ⁡ ( n k ) ) ⩾ Θ ( n k ) > Θ ( n lg ⁡ n ) Theta(nk+nlg(cfrac{n}{k}))geqslantTheta(nk)>Theta(nlg n) Θ(nk+nlg(kn))Θ(nk)>Θ(nlgn)与等式不符,所以有 k ⩽ lg ⁡ n kleqslantlg n klgn。当 k = lg ⁡ n k=lg n k=lgn Θ ( n lg ⁡ ( n k ) ) = Θ ( n lg ⁡ ( n lg ⁡ n ) ) < Θ ( n lg ⁡ n ) Theta(nlg(cfrac{n}{k}))=Theta(nlg(cfrac{n}{lg n}))<Theta(nlg n) Θ(nlg(kn))=Θ(nlg(lgnn))<Θ(nlgn) Θ ( n lg ⁡ n + n lg ⁡ ( n lg ⁡ n ) ) = Θ ( n lg ⁡ n ) Theta(nlg n+nlg(cfrac{n}{lg n}))=Theta(nlg n) Θ(nlgn+nlg(lgnn))=Θ(nlgn)
所以k的最大值为 lg ⁡ n lg n lgn

d.根据c的答案,我们应该选择 k = ⌊ lg ⁡ n ⌋ k=lfloorlg nrfloor k=lgn

2-2

a.还要证明A’和A是元素相同的序列?

b.循环不变式:A[j]是子数组A[j…A.length]的最小值
初始化:j=A.length,子数组为A[A.length…A.length],只有A[A.length]一个元素,满足条件。
保持:假设某次迭代j=k,有A[k]为A[k…A.length]的最小值,根据3-4行。A[j-1]即A[k-1]将是A[k-1…A.length]中的最小值,则下一次迭代j=k-1前,A[k-1]是A[k-1…A.length]中的最小值。
终止:当j=i时循环终止,此时A[i]正好是数组A[i…A.length]的最小值

c.循环不变式:A[1…i-1]已经放入排序后的元素。
初始化:j=1,子数组为A[1…0]中没有元素,满足条件。
保持:假设某次迭代i=k,有A[1…k-1]已经放入排序后的元素。根据b的证明,内层循环让A[k]正好是数组A[k…A.length]的最小值,因为有A[1…k-1]已经是A的有序排列,所以A[1…k]也已经排序完毕。则在下一次迭代i=k+1前,A[1…k]已经放入排序后的元素。
终止:当i=A.length时循环终止,此时A[1…A.length-1]已经排序完毕,则剩下的A[A.length]也一定是最大的元素,所以A完成排序。

d.冒泡排序最坏情况时间复杂度为 Θ ( n 2 ) Theta(n^2) Θ(n2)
性能不如插入排序,因为冒泡排序最好情况时间复杂度也为 Θ ( n 2 ) Theta(n^2) Θ(n2),而插入排序最好情况时间复杂度为 Θ ( n ) Theta(n) Θ(n)

2-3

a.运行时间为 Θ ( n ) Theta(n) Θ(n)

b.

y = 0
for i in range(n+1):
	mul = 1
	for j in range(i):
		mul*=x
	y += a[i]*mul

时间复杂度为 Θ ( n 2 ) Theta(n^2) Θ(n2)。性能远不如使用霍纳规则

c.
初始化:i=n,所以 y = ∑ k = 0 − 1 a k + n + 1 x k = 0 y=sumlimits_{k=0}^{-1}a_{k+n+1}x^k=0 y=k=01ak+n+1xk=0
保持:假设某次迭代i=m,有 y = ∑ k = 0 n − m + 1 a k + m + 1 x k y=sumlimits_{k=0}^{n-m+1}a_{k+m+1}x^k y=k=0nm+1ak+m+1xk,在本次迭代中
y = a m + x ∑ k = 0 n − m − 1 a k + m + 1 x k = a m + ∑ k = 0 n − m − 1 a k + m + 1 x k + 1 = a m + ∑ k = 0 n − m − 1 a k + m + 1 x k + 1 y=a_m+xsumlimits_{k=0}^{n-m-1}a_{k+m+1}x^k=a_m+sumlimits_{k=0}^{n-m-1}a_{k+m+1}x^{k+1}=a_m+sumlimits_{k=0}^{n-m-1}a_{k+m+1}x^{k+1} y=am+xk=0nm1ak+m+1xk=am+k=0nm1ak+m+1xk+1=am+k=0nm1ak+m+1xk+1,令t=k+1,则 y = a m + ∑ t = 1 n − m a t + m x t = ∑ t = 0 n − m a t + m x t y=a_m+sumlimits_{t=1}^{n-m}a_{t+m}x^{t}=sumlimits_{t=0}^{n-m}a_{t+m}x^{t} y=am+t=1nmat+mxt=t=0nmat+mxt,令t=k,则 y = ∑ k = 0 n − m a k + m x k = y = ∑ k = 0 n − [ ( m − 1 ) + 1 ] a k + ( m − 1 ) + 1 x k y=sumlimits_{k=0}^{n-m}a_{k+m}x^{k}=y=sumlimits_{k=0}^{n-[(m-1)+1]}a_{k+(m-1)+1}x^{k} y=k=0nmak+mxk=y=k=0n[(m1)+1]ak+(m1)+1xk,而下一次迭代前i=m-1,等式 y = ∑ k = 0 n − i + 1 a k + i + 1 x k y=sumlimits_{k=0}^{n-i+1}a_{k+i+1}x^k y=k=0ni+1ak+i+1xk成立
终止:i=-1时终止,所以 y = ∑ k = 0 n a k x k y=sumlimits_{k=0}^{n}a_{k}x^k y=k=0nakxk

d.根据c中循环不变式的证明可得结论

2-4

a.(1,5) (2,5) (3,4) (3,5) (4,5)

b.数组降序排列时逆序对最多,有 ( n − 1 ) + ( n − 2 ) + ⋯ + 1 = n ( n − 1 ) 2 (n-1)+(n-2)+cdots+1=cfrac{n(n-1)}{2} (n1)+(n2)++1=2n(n1)个逆序对。

c.插入排序运行时间和逆序对数成线性关系。
插入排序中的位置交换全部发生在相邻的元素之间,假设A[m]、A[m+1]之间发生交换,可知A[m]相对于A[1…m-1]和A[m+2…n]的位置没有变化,同理A[m+1]也如此,所以逆序数的变化只存在于A[m]、A[m+1]之间,又因为交换只在A[m+1]<A[m]即(m,m+1)为逆序对时,所以交换后逆序数减一。
反之,如果(m,m+1)为逆序对,当外层循环遍历到m+1时,假设m移动到m’处,则一定有A[m’]是A[m’…m]中最小的元素,因为(m,m+1)为逆序对即A[m’]>A[m+1],所以A[m+1]一定小于A[m’…m]中任一元素,所以A[m+1]一定会和A[m’…m]中所有元素依次交换。
所以插入排序的交换次数和逆序数等价。

d.由c的部分可知当归并两个子数组时只会减少子数组中的逆序对数,而子数组与子数组外的数字逆序数对不会改变,所以只需要在归并排序的Merge中统计每次的逆序对数,即可计算总逆序对数。

def mergeCount(arr, p, q):
    diff = q - p
    if diff > 0:
        half = (p + q) // 2
        a = mergeCount(arr, p, half)
        b = mergeCount(arr, half + 1, q)
        c = merge(arr, p, half, q)
        return a + b + c
    else:
        return 0


def count(arr):
    return mergeCount(arr, 0, len(arr) - 1)


def merge(arr, p, q, r):
    n1 = q - p + 1
    n2 = r - q
    L = arr[p:q + 1]
    R = arr[q + 1:r + 1]
    i = j = 0
    k = p
    cnt = 0
    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
            cnt += n1-i
        k += 1
    while i < n1:
        arr[k] = L[i]
        k += 1
        i += 1
    while j < n2:
        arr[k] = R[j]
        k += 1
        j += 1
    return cnt

第三章 函数的增长

练习

3.1 渐进记号

3.1-1

因为 f ( n ) f(n) f(n) g ( n ) g(n) g(n)都是渐进非负函数,所以有 max ⁡ ( f ( n ) , g ( n ) ) ⩽ f ( n ) + g ( n ) max(f(n),g(n))leqslant f(n)+g(n) max(f(n),g(n))f(n)+g(n),而且
显然 2 ⋅ max ⁡ ( f ( n ) , g ( n ) ) ⩾ f ( n ) + g ( n ) 2cdot max(f(n),g(n))geqslant f(n)+g(n) 2max(f(n),g(n))f(n)+g(n),综上有 1 2 [ f ( n ) + g ( n ) ] ⩽ f ( n ) + g ( n ) max ⁡ ( f ( n ) , g ( n ) ) ⩽ f ( n ) + g ( n ) cfrac{1}{2}[f(n)+g(n)]leqslant f(n)+g(n)max(f(n),g(n))leqslant f(n)+g(n) 21[f(n)+g(n)]f(n)+g(n)max(f(n),g(n))f(n)+g(n)
根据渐进记号 Θ Theta Θ的定义,所以 max ⁡ ( f ( n ) , g ( n ) ) = Θ ( f ( n ) + g ( n ) ) max(f(n),g(n))= Theta(f(n)+g(n)) max(f(n),g(n))=Θ(f(n)+g(n))

3.1-2

c 2 > 1 c_2>1 c2>1,令 n 0 + a = c 2 n 0 n_0+a=c_2n_0 n0+a=c2n0,求得 n 0 = a c 2 − 1 n_0=cfrac{a}{c_2-1} n0=c21a,显然当 n > n 0 n>n_0 n>n0时有 n + a < c 2 n n+a<c_2n n+a<c2n,又因为 b > 0 b>0 b>0,所以 ( n + a ) b < ( c 2 n ) b = c 2 b n b (n+a)^b<(c_2n)^b=c_2^bn^b (n+a)b<(c2n)b=c2bnb
同理可得 ( c 1 n ) b < ( n + a ) b (c_1n)^b<(n+a)^b (c1n)b<(n+a)b,所以 ( c 1 n ) b < ( n + a ) b < ( c 2 n ) b (c_1n)^b<(n+a)^b<(c_2n)^b (c1n)b<(n+a)b<(c2n)b即可得 ( n + a ) b = Θ ( n b ) (n+a)^b=Theta(n^b) (n+a)b=Θ(nb)

3.1-3

因为至少是一个描述下限的词,而 O ( n 2 ) O(n^2) O(n2)只代表函数上界是 n 2 n^2 n2级别的,但没有限制下界, O ( n 2 ) O(n^2) O(n2)中的函数可以任意小,用这些函数描述下限是没有意义的。

3.1-4

2 n + 1 = O ( 2 n ) 2^{n+1}=O(2^n) 2n+1=O(2n)成立,因为 2 n + 1 = 2 ⋅ 2 n < 3 ⋅ 2 n 2^{n+1}=2cdot2^{n}<3cdot2^{n} 2n+1=22n<32n
2 2 n = O ( 2 n ) 2^{2n}=O(2^n) 22n=O(2n)不成立。假设等式成立,则一定存在正整数 n 0 n_0 n0和正实数 c c c,当 n > n 0 n>n_0 n>n0时有 2 2 n < c 2 n 2^{2n}<c2^n 22n<c2n恒成立,即 c > 2 n c>2^{n} c>2n,显然当 n > lg ⁡ c n>lg c n>lgc时假设不成立,所以等式不成立。

3.1-5

必要性:
f ( n ) = Θ ( g ( n ) ) f(n)=Theta(g(n)) f(n)=Θ(g(n))的定义为存在正整数 n 0 n_0 n0和正实数 c 1 , c 2 c_1,c_2 c1,c2,使 n > n 0 n>n_0 n>n0时有 c 1 g ( n ) < f ( n ) < c 2 g ( n ) c_1g(n)<f(n)<c_2g(n) c1g(n)<f(n)<c2g(n)。由 n > n 0 n>n_0 n>n0时有 f ( n ) > c 1 g ( n ) f(n)>c_1g(n) f(n)>c1g(n) f ( n ) = Ω ( g ( n ) ) f(n)=Omega(g(n)) f(n)=Ω(g(n)),由 n > n 0 n>n_0 n>n0时有 f ( n ) < c 2 g ( n ) f(n)<c_2g(n) f(n)<c2g(n) f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))

充分性:
f ( n ) = Ω ( g ( n ) ) f(n)=Omega(g(n)) f(n)=Ω(g(n))得存在正整数 n 1 n_1 n1和正实数 c 1 c_1 c1使 n > n 1 n>n_1 n>n1时有 f ( n ) > c 1 g ( n ) f(n)>c_1g(n) f(n)>c1g(n),由 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))得存在正整数 n 2 n_2 n2和正实数 c 2 c_2 c2使 n > n 2 n>n_2 n>n2时有 f ( n ) < c 2 g ( n ) f(n)<c_2g(n) f(n)<c2g(n),取 n 0 = max ⁡ ( n 1 , n 2 ) n_0=max(n_1,n_2) n0=max(n1,n2),则当 n > n 0 n>n_0 n>n0时满足 c 1 g ( n ) < f ( n ) < c 2 g ( n ) c_1g(n)<f(n)<c_2g(n) c1g(n)<f(n)<c2g(n),即 f ( n ) = Θ ( g ( n ) ) f(n)=Theta(g(n)) f(n)=Θ(g(n))

综上可证 f ( n ) = Θ ( g ( n ) ) f(n)=Theta(g(n)) f(n)=Θ(g(n))当且仅当 f ( n ) = Ω ( g ( n ) ) f(n)=Omega(g(n)) f(n)=Ω(g(n)) f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))

3.1-6

因为最坏运行时间为 O ( g ( n ) ) O(g(n)) O(g(n)),而 O ( g ( n ) ) O(g(n)) O(g(n))又表示运行时间的上限,所以运行时间一定满足 O ( g ( n ) ) O(g(n)) O(g(n)),同理可得运行时间也满足 Ω ( g ( n ) ) Omega(g(n)) Ω(g(n)),由定义3.1得运行时间为 Θ ( g ( n ) ) Theta(g(n)) Θ(g(n))

3.1-7

根据 o o o记号的定义,存在常量 n 1 n_1 n1对任意正常量 c 1 c_1 c1,使 n > n 1 n>n_1 n>n1时有 f ( n ) < c 1 g ( n ) f(n)<c_1g(n) f(n)<c1g(n)
根据 ω omega ω记号的定义,存在常量 n 2 n_2 n2对任意正常量 c 2 c_2 c2,使 n > n 2 n>n_2 n>n2时有 f ( n ) > c 2 g ( n ) f(n)>c_2g(n) f(n)>c2g(n)
n 0 = max ⁡ ( n 1 , n 2 ) n_0=max(n_1,n_2) n0=max(n1,n2),显然当 n > n 0 n>n_0 n>n0时无法同时满足 f ( n ) < c 1 g ( n ) f(n)<c_1g(n) f(n)<c1g(n) f ( n ) > c 2 g ( n ) f(n)>c_2g(n) f(n)>c2g(n),所以 o ( g ( n ) ) o(g(n)) o(g(n)) ω ( g ( n ) ) omega (g(n)) ω(g(n))没有交集。

3.1-8

Ω ( g ( n , m ) ) = { f ( n , m ) : 存 在 正 常 量 c 、 n 0 和 m 0 , 使 得 对 所 有 n ⩾ n 0 或 m ⩾ m 0 , 有 f ( n , m ) ⩾ c g ( n , m ) } Omega(g(n,m)) = { f(n,m) : 存在正常量 c、n_0和m_0,使得对所有n geqslant n_0或m geqslant m_0,有f(n,m)geqslant cg(n,m)} Ω(g(n,m))={f(n,m):cn0m0使nn0mm0f(n,m)cg(n,m)}
Θ ( g ( n , m ) ) = { f ( n , m ) : 存 在 正 常 量 c 1 、 c 2 、 n 0 和 m 0 , 使 得 对 所 有 n ⩾ n 0 或 m ⩾ m 0 , 有 c 1 g ( n , m ) ⩽ f ( n , m ) ⩽ c 2 g ( n , m ) } Theta(g(n,m)) = { f(n,m) : 存在正常量 c_1、c_2、n_0和m_0,使得对所有n geqslant n_0或m geqslant m_0,有c_1g(n,m)leqslant f(n,m)leqslant c_2g(n,m)} Θ(g(n,m))={f(n,m):c1c2n0m0使nn0mm0c1g(n,m)f(n,m)c2g(n,m)}

3.2 标准记号与常用函数

3.2-1

根据 f ( x ) f(x) f(x) g ( x ) g(x) g(x)的单调性,对任意的 x 1 < x 2 x_1<x_2 x1<x2,总有 f ( x 1 ) < f ( x 2 ) f(x_1)<f(x_2) f(x1)<f(x2) g ( x 1 ) < g ( x 2 ) g(x_1)<g(x_2) g(x1)<g(x2)。所以对任意的 x 1 < x 2 x_1<x_2 x1<x2一定有 f ( x 1 ) + g ( x 1 ) < f ( x 2 ) + g ( x 2 ) f(x_1)+g(x_1)<f(x_2)+g(x_2) f(x1)+g(x1)<f(x2)+g(x2),即 f ( x ) + g ( x ) f(x)+g(x) f(x)+g(x)也单调递增。
因为 f ( x ) f(x) f(x)的单调性,对任意的 x 1 < x 2 x_1<x_2 x1<x2,总有 f ( x 1 ) < f ( x 2 ) f(x_1)<f(x_2) f(x1)<f(x2)
又因为 g ( x ) g(x) g(x)的单调性, f ( x 1 ) < f ( x 2 ) f(x_1)<f(x_2) f(x1)<f(x2)可以得到 g ( f ( x 1 ) ) < g ( f ( x 2 ) ) g(f(x_1))<g(f(x_2)) g(f(x1))<g(f(x2)),所以 g ( f ( x ) ) g(f(x)) g(f(x))也单调递增。
如果 f ( x ) f(x) f(x) g ( x ) g(x) g(x)是非负的,即对任意的 x 1 < x 2 x_1<x_2 x1<x2,总有 0 ⩽ f ( x 1 ) < f ( x 2 ) 0leqslant f(x_1)<f(x_2) 0f(x1)<f(x2) 0 ⩽ g ( x 1 ) < g ( x 2 ) 0leqslant g(x_1)<g(x_2) 0g(x1)<g(x2),那对任意的 x 1 < x 2 x_1<x_2 x1<x2一定有 f ( x 1 ) g ( x 1 ) < f ( x 2 ) g ( x 2 ) f(x_1)g(x_1)<f(x_2)g(x_2) f(x1)g(x1)<f(x2)g(x2),所以 f ( x ) g ( x ) f(x)g(x) f(x)g(x)也单调递增。

3.2-2

l o g b c = x log_{b}c=x logbc=x,即 b x = c b^x=c bx=c,则有
a l o g b c = a x = b l o g b a x = b x l o g b a = ( b x ) l o g b a = c l o g b a a^{log_{b}c}=a^x=b^{log_ba^x}=b^{xlog_ba}=(b^{x})^{log_ba}=c^{log_ba} alogbc=ax=blogbax=bxlogba=(bx)logba=clogba

3.2-3

根据斯特林公式, lg ⁡ ( n ! ) = lg ⁡ ( 2 π n ( n e ) n ( 1 + Θ ( 1 n ) ) ) = lg ⁡ 2 π n + lg ⁡ ( n e ) n + lg ⁡ ( 1 + Θ ( 1 n ) ) = 1 2 lg ⁡ 2 π n + n l g n e + lg ⁡ ( 1 + Θ ( 1 n ) ) = Θ ( lg ⁡ n ) + Θ ( n lg ⁡ n ) + Θ ( lg ⁡ n ) = Θ ( n lg ⁡ n ) lg(n!)=lg(sqrt{2pi n}(cfrac{n}{e})^n(1+Theta(cfrac{1}{n})))=lgsqrt{2pi n}+lg(cfrac{n}{e})^n+lg(1+Theta(cfrac{1}{n}))=cfrac{1}{2}lg2pi n+n\lgcfrac{n}{e}+lg(1+Theta(cfrac{1}{n}))=Theta(lg n)+Theta(nlg n)+Theta(lg n)=Theta(nlg n) lg(n!)=lg(2πn (en)n(1+Θ(n1)))=lg2πn +lg(en)n+lg(1+Θ(n1))=21lg2πn+nlgen+lg(1+Θ(n1))=Θ(lgn)+Θ(nlgn)+Θ(lgn)=Θ(nlgn)
因为 lim ⁡ n → ∞ n ! n n = lim ⁡ n → ∞ 1 n lim ⁡ n → ∞ 2 n ⋯ lim ⁡ n → ∞ n n = 0 limlimits_{nrarr infin}cfrac{n!}{n^n}=limlimits_{nrarr infin}cfrac{1}{n}limlimits_{nrarr infin}cfrac{2}{n}cdotslimlimits_{nrarr infin}cfrac{n}{n}=0 nlimnnn!=nlimn1nlimn2nlimnn=0,所以 n ! = o ( n n ) n!=o(n^n) n!=o(nn)
因为 lim ⁡ n → ∞ n ! 2 n = lim ⁡ n → ∞ 1 2 lim ⁡ n → ∞ 2 2 ⋯ lim ⁡ n → ∞ n 2 = ∞ limlimits_{nrarr infin}cfrac{n!}{2^n}=limlimits_{nrarr infin}cfrac{1}{2}limlimits_{nrarr infin}cfrac{2}{2}cdotslimlimits_{nrarr infin}cfrac{n}{2}=infin nlim2nn!=nlim21nlim22nlim2n=,所以 n ! = ω ( 2 n ) n!=omega(2^n) n!=ω(2n)

3.2-6

ϕ 2 = ( 1 + 5 2 ) 2 = 6 + 2 5 4 = 3 + 5 2 = 1 + 5 2 + 1 = ϕ + 1 phi^2=(cfrac{1+sqrt{5}}{2})^2=cfrac{6+2sqrt{5}}{4}=cfrac{3+sqrt{5}}{2}=cfrac{1+sqrt{5}}{2}+1=phi+1 ϕ2=(21+5 )2=46+25 =23+5 =21+5 +1=ϕ+1
ϕ ^ 2 = ( 1 − 5 2 ) 2 = 6 − 2 5 4 = 3 − 5 2 = 1 − 5 2 + 1 = ϕ ^ + 1 {hatphi}^2=(cfrac{1-sqrt{5}}{2})^2=cfrac{6-2sqrt{5}}{4}=cfrac{3-sqrt{5}}{2}=cfrac{1-sqrt{5}}{2}+1=hatphi+1 ϕ^2=(215 )2=4625 =235 =215 +1=ϕ^+1

3.2-7

当i=1时,有 F 1 = ϕ − ϕ ^ 5 = 1 F_1=cfrac{phi-hatphi}{sqrt{5}}=1 F1=5 ϕϕ^=1
假设当i=k和i=k+1时等式成立。
那么 F k + 2 = F k + F k + 1 = ϕ k − ϕ ^ k 5 + ϕ k + 1 − ϕ ^ k + 1 5 = ϕ k ( ϕ + 1 ) − ϕ ^ k ( ϕ ^ + 1 ) 5 = ϕ k ( ϕ 2 ) − ϕ ^ k ( ϕ ^ 2 ) 5 = ϕ k + 2 − ϕ ^ k + 2 5 F_{k+2}=F_{k}+F_{k+1}=cfrac{{phi}^k-{hatphi}^k}{sqrt{5}}+cfrac{{phi}^{k+1}-{hatphi}^{k+1}}{sqrt{5}}=cfrac{{phi}^k(phi+1)-{hatphi}^k(hatphi+1)}{sqrt{5}}=cfrac{{phi}^k({phi}^2)-{hatphi}^k({hatphi}^2)}{sqrt{5}}=cfrac{{phi}^{k+2}-{hatphi}^{k+2}}{sqrt{5}} Fk+2=Fk+Fk+1=5 ϕkϕ^k+5 ϕk+1ϕ^k+1=5 ϕk(ϕ+1)ϕ^k(ϕ^+1)=5 ϕk(ϕ2)ϕ^k(ϕ^2)=5 ϕk+2ϕ^k+2
综上等式成立

3.2-8

k ln ⁡ k = Θ ( n ) kln k=Theta(n) klnk=Θ(n) k ln ⁡ k ⩽ c 2 n kln kleqslant c_2n klnkc2n ln ⁡ k c 2 k ⩽ n cfrac{ln k}{c_2}kleqslant n c2lnkkn,而 lim ⁡ k → ∞ ln ⁡ k c 2 > 1 limlimits_{krarr infin}cfrac{ln k}{c_2}>1 klimc2lnk>1,所以有 k < n k<n k<n

k ln ⁡ k = Θ ( n ) kln k=Theta(n) klnk=Θ(n) c 1 n ⩽ k ln ⁡ k ⩽ c 2 n c_1nleqslant kln kleqslant c_2n c1nklnkc2n
k < n k<n k<n k ln ⁡ k < k ln ⁡ n kln k<k ln n klnk<klnn,所以 k ln ⁡ n > c 1 n k ln n>c_1n klnn>c1n k > c 1 n ln ⁡ n k>c_1cfrac{n}{ln n} k>c1lnnn
ln ⁡ k < ln ⁡ n ln k < ln n lnk<lnn k ln ⁡ k ⩽ c 2 n kln kleqslant c_2n klnkc2n k < c 2 n ln ⁡ n k<c_2cfrac{n}{ln n} k<c2lnnn
所以 k = Θ ( n ln ⁡ n ) k=Theta(cfrac{n}{ln n}) k=Θ(lnnn)

思考题

3-1 多项式的渐进行为

引理1:当n足够大时,多项式 p ( n ) = ∑ i = 0 d a i n i p(n)=sumlimits_{i=0}^{d}a_in^i p(n)=i=0daini中最高项系数 a d > 0 a_d>0 ad>0 p ( n ) p(n) p(n)单调递增, a d < 0 a_d<0 ad<0 p ( n ) p(n) p(n)单调递减
证明:多项式 p ( n ) p(n) p(n)的m阶导数为 p ( m ) ( n ) = ∑ i = m d a i A i m n i − m p^{(m)}(n)=sumlimits_{i=m}^{d}a_iA_{i}^{m}n^{i-m} p(m)(n)=i=mdaiAimnim,则d阶导数为 p ( d ) ( n ) = ∑ i = d d a i A i d n i − d = a d d ! p^{(d)}(n)=sumlimits_{i=d}^{d}a_iA_{i}^{d}n^{i-d}=a_dd! p(d)(n)=i=ddaiAidnid=add! a d > 0 a_d>0 ad>0时d阶导数 p ( d ) ( n ) = a d d ! > 0 p^{(d)}(n)=a_dd!>0 p(d)(n)=add!>0,所以d-1阶导数单调递增
d-1阶导数为 p ( d − 1 ) ( n ) = ∑ i = d − 1 d a i A i d − 1 n i − d + 1 = a d − 1 ( d − 1 ) ! + a d A d d − 1 n p^{(d-1)}(n)=sumlimits_{i=d-1}^{d}a_iA_{i}^{d-1}n^{i-d+1}=a_{d-1}(d-1)!+a_dA_{d}^{d-1}n p(d1)(n)=i=d1daiAid1nid+1=ad1(d1)!+adAdd1n,令 p ( d − 1 ) ( n ) = 0 p^{(d-1)}(n)=0 p(d1)(n)=0,因为 p ( d − 1 ) ( n ) p^{(d-1)}(n) p(d1)(n)单调递增,若等式无解,则 p ( d − 1 ) ( n ) > 0 p^{(d-1)}(n)>0 p(d1)(n)>0恒成立;若有解,假设解为 n d − 1 n_{d-1} nd1,则当 n > n d − 1 n>n_{d-1} n>nd1 p ( d − 1 ) ( n ) > 0 p^{(d-1)}(n)>0 p(d1)(n)>0恒成立。综上当n足够大时 p ( d − 1 ) ( n ) > 0 p^{(d-1)}(n)>0 p(d1)(n)>0恒成立,也即 p ( d − 2 ) ( n ) p^{(d-2)}(n) p(d2)(n)单调递增。

以此类推,可得当n足够大时,多项式 p ( n ) p(n) p(n)单调递增

同理可证 a d < 0 a_d<0 ad<0 p ( n ) p(n) p(n)单调递减


引理2:n趋近于无穷时,多项式函数 p ( n ) = ∑ i = 0 d a i n i p(n)=sumlimits_{i=0}^{d}a_in^i p(n)=i=0daini的极限也趋近于无穷。
证明:首先证 1 p ( n ) ∼ 1 a d n d ( n → + ∞ ) cfrac{1}{p(n)}sim cfrac{1}{a_dn^d}(nrarr +infin) p(n)1adnd1(n+)
因为 lim ⁡ n → + ∞ p ( n ) = lim ⁡ n → + ∞ 1 a d n d 1 p ( n ) = lim ⁡ n → + ∞ p ( n ) a d n d = lim ⁡ n → + ∞ a 0 a d n d + lim ⁡ n → + ∞ a 1 a d n d − 1 + ⋯ + lim ⁡ n → + ∞ a d − 1 a d n + 1 = 1 limlimits_{nrarr +infin}p(n)=limlimits_{nrarr +infin}cfrac{cfrac{1}{a_dn^d}}{cfrac{1}{p(n)}}=limlimits_{nrarr +infin}cfrac{p(n)}{a_dn^d}=limlimits_{nrarr +infin}cfrac{a_{0}}{a_dn^d}+limlimits_{nrarr +infin}cfrac{a_1}{a_dn^{d-1}}+cdots+limlimits_{nrarr +infin}cfrac{a_{d-1}}{a_dn}+1=1 n+limp(n)=n+limp(n)1adnd1=n+limadndp(n)=n+limadnda0+n+limadnd1a1++n+limadnad1+1=1,等价无穷小证毕。
所以 lim ⁡ n → + ∞ p ( n ) = lim ⁡ n → + ∞ 1 1 p ( n ) = lim ⁡ n → + ∞ 1 1 a d n d = lim ⁡ n → + ∞ a d n d limlimits_{nrarr +infin}p(n)=limlimits_{nrarr +infin}cfrac{1}{cfrac{1}{p(n)}}=limlimits_{nrarr +infin}cfrac{1}{cfrac{1}{a_dn^d}}=limlimits_{nrarr +infin}{a_dn^d} n+limp(n)=n+limp(n)11=n+limadnd11=n+limadnd,所以n趋近于无穷时,当 p ( n ) p(n) p(n)最高项系数 a d > 0 a_d>0 ad>0 p ( n ) p(n) p(n)趋于正无穷, a d < 0 a_d<0 ad<0 p ( n ) p(n) p(n)趋于负无穷。

a.
c = a d + 1 c=a_d+1 c=ad+1,显然,对于多项式 p ( n ) − c n k p(n)-cn^k p(n)cnk来说,当 k = d k=d k=d时,最高项为 ( a d − c ) n d (a_d-c)n^d (adc)nd,系数 a d − c = − 1 < 0 a_d-c=-1<0 adc=1<0;当 k > d k>d k>d时,最高项为 − c n k -cn^k cnk,系数 − c = − ( a d + 1 ) < 0 -c=-(a_d+1)<0 c=(ad+1)<0。所以多项式 p ( n ) − c n k p(n)-cn^k p(n)cnk单调递减,且在n趋于无穷的极限为负无穷。所以当n足够大时 p ( n ) − c n k < 0 p(n)-cn^k<0 p(n)cnk<0 p ( n ) < c n k p(n)<cn^k p(n)<cnk恒成立,所以 p ( n ) = O ( n k ) p(n)=O(n^k) p(n)=O(nk)

b.
c = a d − 1 c=a_d-1 c=ad1,显然,对于多项式 p ( n ) − c n k p(n)-cn^k p(n)cnk来说,当 k = d k=d k=d时,最高项为 ( a d − c ) n d (a_d-c)n^d (adc)nd,系数 a d − c = 1 > 0 a_d-c=1>0 adc=1>0;当 k < d k<d k<d时,最高项为 a d n d a_dn^d adnd,系数 a d > 0 a_d>0 ad>0。所以多项式 p ( n ) − c n k p(n)-cn^k p(n)cnk单调递增,且在n趋于无穷的极限为正无穷。所以当n足够大时 p ( n ) − c n k > 0 p(n)-cn^k>0 p(n)cnk>0 p ( n ) > c n k p(n)>cn^k p(n)>cnk恒成立,所以 p ( n ) = Ω ( n k ) p(n)=Omega(n^k) p(n)=Ω(nk)

c.
c = a d − 1 c=a_d-1 c=ad1,可得 p ( n ) = Ω ( n k ) p(n)=Omega(n^k) p(n)=Ω(nk);取 c = a d + 1 c=a_d+1 c=ad+1,可得 p ( n ) = O ( n k ) p(n)=O(n^k) p(n)=O(nk),所以 p ( n ) = Θ ( n k ) p(n)=Theta(n^k) p(n)=Θ(nk)

d.
对任意正常量c, p ( n ) − c n k p(n)-cn^k p(n)cnk最高项系数为 − c < 0 -c<0 c<0,所以n足够大时单调递减且趋近负无穷,所以有 0 ⩽ p ( n ) < c n k 0leqslant p(n)<cn^k 0p(n)<cnk,也即 p ( n ) = o ( n ) p(n)=o(n) p(n)=o(n)

e.
对任意正常量c, p ( n ) − c n k p(n)-cn^k p(n)cnk最高项系数为 a d > 0 a_d>0 ad>0,所以n足够大时单调递增且趋近正无穷,所以有 p ( n ) > c n k p(n)>cn^k p(n)>cnk,也即 p ( n ) = ω ( n ) p(n)=omega(n) p(n)=ω(n)

3-2 相对渐进增长

Ab O O O o o o Ω Omega Ω ω omega ω Θ Theta Θ
lg ⁡ k n lg ^k n lgkn n ϵ n^epsilon nϵ
n k n^k nk c n c^n cn
n sqrt{n} n n sin ⁡ n n^{sin n} nsinn
2 n 2^n 2n 2 n / 2 2^{n/2} 2n/2
n lg ⁡ c n ^{lg c} nlgc c lg ⁡ n c^{lg n} clgn
lg ⁡ ( n ! ) lg(n!) lg(n!) lg ⁡ ( n n ) lg(n^n) lg(nn)

3-3 根据渐进增长率排序

a.

g 1 ( n ) = 2 2 n + 1 , g 2 ( n ) = 2 2 n , g_1(n)=2^{2^{n+1}},g_2(n)=2^{2^{n}}, g1(n)=22n+1,g2(n)=22n,
g 3 ( n ) = ( n + 1 ) ! , g 4 ( n ) = n ! , g_3(n)=(n+1)!,g_4(n)=n!, g3(n)=(n+1)!,g4(n)=n!,
g 5 ( n ) = ( lg ⁡ n ) ! , g_5(n)=(lg n)!, g5(n)=(lgn)!,
g 6 ( n ) = n lg ⁡ lg ⁡ n , g 7 ( n ) = ( lg ⁡ n ) lg ⁡ n , g_6(n)=n^{lglg n},g_7(n)=(lg n)^{lg n}, g6(n)=nlglgn,g7(n)=(lgn)lgn,
g 8 ( n ) = n 2 n , g_8(n)=n2^n, g8(n)=n2n,
g 9 ( n ) = e n , g_9(n)=e^n, g9(n)=en,
g 10 ( n ) = 2 n , g_{10}(n)=2^n, g10(n)=2n,
g 11 ( n ) = ( 3 2 ) n , g_{11}(n)=(cfrac{3}{2})^n, g11(n)=(23)n,
g 12 ( n ) = 2 2 lg ⁡ n , g_{12}(n)=2^{sqrt{2lg n}}, g12(n)=22lgn ,
g 13 ( n ) = n 3 , g_{13}(n)=n^3, g13(n)=n3,
g 14 ( n ) = 4 lg ⁡ n , g 15 ( n ) = n 2 , g_{14}(n)=4^{lg n},g_{15}(n)=n^2, g14(n)=4lgn,g15(n)=n2,
g 16 ( n ) = n lg ⁡ n , g 17 ( n ) = lg ⁡ ( n ! ) , g_{16}(n)=n{lg n},g_{17}(n)=lg (n!), g16(n)=nlgn,g17(n)=lg(n!),
g 18 ( n ) = n , g 19 ( n ) = 2 lg ⁡ n , g_{18}(n)=n,g_{19}(n)=2^{lg n}, g18(n)=n,g19(n)=2lgn,
g 20 ( n ) = ( 2 ) lg ⁡ n , g_{20}(n)=(sqrt{2})^{lg n}, g20(n)=(2 )lgn,
g 21 ( n ) = lg ⁡ 2 n , g_{21}(n)=lg^2 n, g21(n)=lg2n,
g 22 ( n ) = ln ⁡ n , g_{22}(n)=ln n, g22(n)=lnn,
g 23 ( n ) = lg ⁡ n , g_{23}(n)=sqrt{lg n}, g23(n)=lgn ,
g 24 ( n ) = ln ⁡ ln ⁡ n , g_{24}(n)=ln ln n, g24(n)=lnlnn,
g 25 ( n ) = 2 lg ⁡ ∗ n , g 26 ( n ) = lg ⁡ ∗ n , g 27 ( n ) = lg ⁡ ∗ ( lg ⁡ n ) , g 28 ( n ) = lg ⁡ ( lg ⁡ ∗ n ) , g_{25}(n)=2^{lg^* n},g_{26}(n)={lg^* n},g_{27}(n)={lg^* (lg n)},g_{28}(n)=lg({lg^* n}), g25(n)=2lgn,g26(n)=lgn,g27(n)=lg(lgn),g28(n)=lg(lgn),
g 29 ( n ) = 1 , g 30 ( n ) = n 1 / lg ⁡ n , g_{29}(n)=1,g_{30}(n)=n^{1/lg n}, g29(n)=1,g30(n)=n1/lgn,

b.
2 2 x s i n ( x ) 2^{2^{xsin(x)}} 22xsin(x)

3-4 渐进记号的性质

这里假设渐进正函数不包括常量,即。

a.不成立,对 f ( n ) = n , g ( n ) = n 2 f(n) = n,g(n)=n^2 f(n)=n,g(n)=n2而言, f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n)) g ( n ) ≠ O ( f ( n ) ) g(n)neq O(f(n)) g(n)=O(f(n))

b.不成立,对 f ( n ) = n , g ( n ) = n 2 f(n) = n,g(n)=n^2 f(n)=n,g(n)=n2而言, f ( n ) + g ( n ) = Θ ( n 2 ) f(n)+g(n)=Theta(n^2) f(n)+g(n)=Θ(n2) min ⁡ ( f ( n ) , g ( n ) ) = n ≠ n 2 min(f(n),g(n))=nneq n^2 min(f(n),g(n))=n=n2

c.成立。由 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))可得 f ( n ) < c g ( n ) f(n)<cg(n) f(n)<cg(n),当n足够大时有 lg ⁡ f ( n ) < lg ⁡ ( c g ( n ) ) = lg ⁡ g ( n ) + lg ⁡ c lg f(n)<lg(cg(n))=lg g(n)+lg c lgf(n)<lg(cg(n))=lgg(n)+lgc,取 g ( n 0 ) = c g(n_0)=c g(n0)=c,则 lg ⁡ f ( n ) < lg ⁡ g ( n ) + lg ⁡ c = lg ⁡ g ( n ) + lg ⁡ g ( n 0 ) < 2 lg ⁡ g ( n ) lg f(n)<lg g(n)+lg c=lg g(n)+lg g(n_0) <2lg g(n) lgf(n)<lgg(n)+lgc=lgg(n)+lgg(n0)<2lgg(n)

d.不成立。对 f ( n ) = 4 n , g ( n ) = n f(n) = 4n,g(n)=n f(n)=4n,g(n)=n而言, f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n)) 2 f ( n ) = 2 4 n = 1 6 n 2^{f(n)}=2^{4n}=16^n 2f(n)=24n=16n 2 g ( n ) = 2 n 2^{g(n)}=2^n 2g(n)=2n,显然 2 f ( n ) ≠ O ( 2 g ( n ) ) 2^{f(n)}neq O(2^{g(n)}) 2f(n)=O(2g(n))

e.不成立。假设成立,一定有 f ( n ) < c f ( n ) 2 f(n)<cf(n)^2 f(n)<cf(n)2,即存在c满足 f ( n ) > 1 c f(n)>cfrac{1}{c} f(n)>c1。因为 f ( n ) f(n) f(n)是正函数,如果 f ( n ) f(n) f(n)的最小值不趋于0,则一定存在c满足条件;如果 f ( n ) f(n) f(n)的最小值趋于0,就没有确定的c满足条件,所以不成立。

f.成立。由 f ( n ) < c g ( n ) f(n)<cg(n) f(n)<cg(n)可以推出 g ( n ) > 1 c f ( n ) g(n)>cfrac{1}{c}f(n) g(n)>c1f(n)

g.不成立。对 f ( n ) = 2 n f(n) = 2^n f(n)=2n而言, f ( n 2 ) = 2 n 2 = 2 n f(cfrac{n}{2})=2^{frac{n}{2}}=sqrt{2}^n f(2n)=22n=2 n,显然 f ( n ) = ω ( f ( n 2 ) ) f(n)=omega(f(cfrac{n}{2})) f(n)=ω(f(2n))

h.成立。设 g ( n ) = o ( f ( n ) ) g(n)=o(f(n)) g(n)=o(f(n)),则有 f ( n ) ⩽ f ( n ) + g ( n ) < f ( n ) + c f ( n ) ⩽ ( c + 1 ) f ( n ) f(n)leqslant f(n)+g(n) <f(n) + cf(n)leqslant (c+1)f(n) f(n)f(n)+g(n)<f(n)+cf(n)(c+1)f(n)

3-5 O O O Ω Omega Ω的一些变形

a.非形式化地说, O ( g ( n ) ) O(g(n)) O(g(n))的否命题是存在c使得对某些n满足 f ( n ) ⩾ c g ( n ) f(n)geqslant cg(n) f(n)cg(n),如果这些n是有限个,取这些n的最大值 n 0 n_0 n0,当 n > n 0 n>n_0 n>n0依然会满足 f ( n ) ⩽ g ( n ) f(n)leqslant g(n) f(n)g(n)也即 O ( g ( n ) ) O(g(n)) O(g(n))。所以 O ( g ( n ) ) O(g(n)) O(g(n))的否命题一定是存在c使得对无穷多个n满足 f ( n ) ⩾ c g ( n ) f(n)geqslant cg(n) f(n)cg(n),这正好是 Ω ∞ Omega^infin Ω的定义

b.使用 Ω ∞ Omega^infin Ω的优点是可以刻画一些震荡发散函数的总体下界,缺点是下界不精确,总会存在
摸了

3-6 多重函数

摸了

最后

以上就是孤独蜡烛为你收集整理的《算法导论》练习与思考题第1-3章 (python版)第一章 算法在计算中的作用第二章 算法基础第三章 函数的增长的全部内容,希望文章能够帮你解决《算法导论》练习与思考题第1-3章 (python版)第一章 算法在计算中的作用第二章 算法基础第三章 函数的增长所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(121)

评论列表共有 0 条评论

立即
投稿
返回
顶部