【算法】算法分析技术(第一章习题解答)

1 算法分析技术

在这里插入图片描述

1.1 假设 f f f g g g 是定义在自然数集合上的函数, 若对某个其他函数 h h h f = O ( h ) f = O(h) f=O(h) g = O ( h ) g = O(h) g=O(h) 成立, 那么证明 f + g = O ( h ) f + g = O(h) f+g=O(h)

证明:

根据已知条件 f = O ( h ) f = O(h) f=O(h),存在 c 1 > 0 c_{1}>0 c1>0 和正整数 n 1 n_{1} n1 使得当使得当 n ⩾ n 1 n \geqslant n_{1} nn1 时, 有 f ( n ) ⩽ c 1 h ( n ) f(n) \leqslant c_{1} h(n) f(n)c1h(n)

同理根据已知条件 g = O ( h ) g = O(h) g=O(h),存在 c 2 > 0 c_{2}>0 c2>0 和正整数 n 2 n_{2} n2 使得当使得当 n ⩾ n 2 n \geqslant n_{2} nn2 时, 有 g ( n ) ⩽ c 2 h ( n ) g(n) \leqslant c_{2} h(n) g(n)c2h(n)

取常数 c 0 = max ⁡ { 2 c 1 , 2 c 2 } c_{0}=\max \left\{2 c_{1}\right. , \left.2 c_{2}\right\} c0=max{2c1,2c2} n 0 = max ⁡ { n 1 , n 2 } n_{0}=\max \left\{n_{1}, n_{2}\right\} n0=max{n1,n2}, 那么当 n ⩾ n 0 n \geqslant n_{0} nn0 时,可以得到
f ( n ) + g ( n ) ⩽ c 1 h ( n ) + c 2 h ( n ) ⩽ c h ( n ) f(n)+g(n) \leqslant c_{1} h(n)+c_{2} h(n) \leqslant c h(n) f(n)+g(n)c1h(n)+c2h(n)ch(n)
由此可证 f + g = O ( h ) f + g = O(h) f+g=O(h)

1.2 设 n , a , b n, a, b n,a,b 为正整数, 证明下述性质:

⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ , ⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \left\lceil\frac{\left\lceil\frac{n}{a}\right\rceil}{b}\right\rceil=\left\lceil\frac{n}{a b}\right\rceil,\left\lfloor\frac{\left\lfloor\frac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{n}{a b}\right\rfloor ban=abn,ban=abn

证明:

n n n a b ab ab的整数倍时,设 n = p a b n=pab n=pab,命题1和命题2的等式左右两边化简后均为 p p p,命题显然成立。

n n n不是 a b ab ab的整数倍时,设 n = p a b + r ( 0 < r < a b ) n=pab+r(0<r<ab) n=pab+r(0rab)

命题1等式左边进行如下化简:
⌈ ⌈ n a ⌉ b ⌉ = ⌈ ⌈ p a b + r a ⌉ b ⌉ = ⌈ p b + ⌈ r a ⌉ b ⌉ = ⌈ p + ⌈ r a ⌉ b ⌉ = p + ⌈ ⌈ r a ⌉ b ⌉ = p + 1 \left\lceil\frac{\left\lceil\frac{n}{a}\right\rceil}{b}\right\rceil=\left\lceil\frac{\left\lceil\frac{p a b+r}{a}\right\rceil}{b}\right\rceil=\left\lceil\frac{p b+\left\lceil\frac{r}{a}\right\rceil}{b}\right\rceil=\left\lceil{p+\frac{\left\lceil\frac{r}{a}\right\rceil}{b}}\right\rceil=p+\left\lceil\frac{\left\lceil \frac{r}{a}\right\rceil}{b}\right\rceil=p+1 ban= bapab+r =bpb+ar=p+bar=p+bar=p+1
命题1等式右边进行如下化简:
⌈ n a b ⌉ = ⌈ p a b + r a b ⌉ = ⌈ p + r a b ⌉ = p + ⌈ r a b ⌉ = p + 1 \left\lceil\frac{n}{a b}\right\rceil=\left\lceil\frac{pab+r}{a b}\right\rceil=\left\lceil{p+\frac{r}{a b}}\right\rceil=p+\left\lceil{\frac{r}{a b}}\right\rceil=p+1 abn=abpab+r=p+abr=p+abr=p+1
由此可证
⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \left\lceil\frac{\left\lceil\frac{n}{a}\right\rceil}{b}\right\rceil=\left\lceil\frac{n}{a b}\right\rceil ban=abn
同理对命题2等式左边进行化简:
⌊ ⌊ n a ⌋ b ⌋ = ⌊ ⌊ p a b + r a ⌋ b ⌋ = ⌊ p b + ⌊ r a ⌋ b ⌋ = ⌊ p + ⌊ r a ⌋ b ⌋ = p + ⌊ ⌊ r a ⌋ b ⌋ = p \left\lfloor\frac{\left\lfloor\frac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{p a b+r}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{p b+\left\lfloor\frac{r}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor{p+\frac{\left\lfloor\frac{r}{a}\right\rfloor}{b}}\right\rfloor=p+\left\lfloor\frac{\left\lfloor \frac{r}{a}\right\rfloor}{b}\right\rfloor=p ban= bapab+r =bpb+ar=p+bar=p+bar=p
对命题2等式右边进行化简:
⌊ n a b ⌋ = ⌊ p a b + r a b ⌋ = ⌊ p + r a b ⌋ = p + ⌊ r a b ⌋ = p \left\lfloor\frac{n}{a b}\right\rfloor=\left\lfloor\frac{pab+r}{a b}\right\rfloor=\left\lfloor{p+\frac{r}{a b}}\right\rfloor=p+\left\lfloor{\frac{r}{a b}}\right\rfloor=p abn=abpab+r=p+abr=p+abr=p
由此可证
⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \left\lfloor\frac{\left\lfloor\frac{n}{a}\right\rfloor}{b}\right\rfloor=\left\lfloor\frac{n}{a b}\right\rfloor ban=abn

1.3 对于下面每个函数 f ( n ) f(n) f(n), 用 Θ 符号表示成 f ( n ) = Θ ( g ( n ) ) f(n) = Θ(g(n)) f(n)=Θ(g(n)) 的形式, 其中 g ( n ) 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.001 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 \begin{array}{c} (n-2) !, 5 \log (n+100)^{10}, 2^{2 n}, 0.001 n^{4}+3 n^{3}+1,(\ln n)^{2} \\ n^{1 / 3}+\log n, 3^{n}, \log (n !), \log \left(n^{n+1}\right), 1+\frac{1}{2}+\cdots+\frac{1}{n} \end{array} (n2)!,5log(n+100)10,22n,0.001n4+3n3+1,(lnn)2n1/3+logn,3n,log(n!),log(nn+1),1+21++n1

解:

下表格从上到下按照函数的阶递增的顺序排列:

Θ表达式函数
Θ ( log ⁡ n ) \Theta(\log n) Θ(logn) 1 + 1 2 + ⋯ + 1 n , 5 log ⁡ ( n + 100 ) 10 1+\frac{1}{2}+\cdots+\frac{1}{n}, 5 \log (n+100)^{10} 1+21++n1,5log(n+100)10
Θ ( log ⁡ 2 n ) \Theta\left(\log ^{2} n\right) Θ(log2n) ln ⁡ n ) 2 \ln n)^{2} lnn)2
Θ ( n 3 ) \Theta(\sqrt[3]{n}) Θ(3n ) n 1 / 3 + log ⁡ n , 3 n n^{1 / 3}+\log n, 3^{n} n1/3+logn,3n
Θ ( n log ⁡ n ) \Theta(n \log n) Θ(nlogn) log ⁡ ( n n + 1 ) , log ⁡ ( n ! ) \log \left(n^{n+1}\right),\log (n !) log(nn+1),log(n!)
Θ ( n 4 ) \Theta\left(n^{4}\right) Θ(n4) 0.001 n 4 + 3 n 3 + 1 0.001 n^{4}+3 n^{3}+1 0.001n4+3n3+1
Θ ( 3 n ) \Theta\left(3^{n}\right) Θ(3n) 3 n 3^{n} 3n
Θ ( 4 n ) \Theta\left(4^{n}\right) Θ(4n) 2 2 n 2^{2 n} 22n
Θ ( ( n − 2 ) ! ) \Theta((n-2) !) Θ((n2)!) ( n − 2 ) ! (n-2) ! (n2)!
1.4 求解以下递推方程:

{ T ( n ) = T ( n − 1 ) + n 2 T ( 1 ) = 1 \left\{\begin{array}{c} T(n)=T(n-1)+n^{2} \\ T(1)=1 \end{array}\right. {T(n)=T(n1)+n2T(1)=1

解:

由递推公式 T ( n ) = T ( n − 1 ) + n 2 T(n)=T(n-1)+n^{2} T(n)=T(n1)+n2不断迭代可得
T ( n ) = n 2 + ( n − 1 ) 2 + ⋯ + 2 2 + T ( 1 ) = 1 + 2 2 + ⋯ + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 = Θ ( n 3 ) T(n) =n^{2}+(n-1)^{2}+\cdots+2^{2}+T(1)\\=1+2^{2}+\cdots+n^{2}=\frac{n(n+1)(2 n+1)}{6}=\Theta\left(n^{3}\right) T(n)=n2+(n1)2++22+T(1)=1+22++n2=6n(n+1)(2n+1)=Θ(n3)

1.5 求解以下递推方程:

{ T ( n ) = 9 T ( n / 3 ) + n T ( 1 ) = 1 \left\{\begin{array}{c} T(n)=9 T(n / 3)+n \\ T(1)=1 \end{array}\right. {T(n)=9T(n/3)+nT(1)=1

解:

已知 a = 9 , b = 3 , f ( n ) = n a=9,b=3,f(n)=n a=9,b=3,f(n)=n,运用主定理可得
T ( n ) = Θ ( n log ⁡ 3 9 ) = Θ ( n 2 ) T(n)=\Theta\left(n^{\log _{3} 9}\right)=\Theta\left(n^{2}\right) T(n)=Θ(nlog39)=Θ(n2)

1.6 求解以下递推方程:

{ T ( n ) = T ( n 2 ) + T ( n 4 ) + c n , c  为常数  T ( 1 ) = 1 \left\{\begin{array}{c} T(n)=T\left(\frac{n}{2}\right)+T\left(\frac{n}{4}\right)+c n, c \text { 为常数 } \\ T(1)=1 \end{array}\right. {T(n)=T(2n)+T(4n)+cn,c 为常数 T(1)=1

解:

对该递推方程构建递归树求解,可得第x个递归层复杂度总和为 ( 3 4 ) x − 1 c n \left(\frac{3}{4}\right)^{x-1}cn (43)x1cn

由此可得
T ( n ) = T ( n 2 ) + T ( n 4 ) + c n = T ( n 4 ) + 2 T ( n 8 ) + T ( n 16 ) + 3 c n 4 + c n = c n + 3 c n 4 + ( 3 4 ) 2 c n + ⋯ = [ 1 + 3 4 + ( 3 4 ) 2 + ⋯   ] c n = Θ ( n ) T(n)=T\left(\frac{n}{2}\right)+T\left(\frac{n}{4}\right)+c n=T\left(\frac{n}{4}\right)+2T\left(\frac{n}{8}\right)+T\left(\frac{n}{16}\right)+\frac{3 c n}{4}+c n\\=c n+\frac{3 c n}{4}+\left(\frac{3}{4}\right)^{2} c n+\cdots=\left[1+\frac{3}{4}+\left(\frac{3}{4}\right)^{2}+\cdots\right] c n=\Theta(n) T(n)=T(2n)+T(4n)+cn=T(4n)+2T(8n)+T(16n)+43cn+cn=cn+43cn+(43)2cn+=[1+43+(43)2+]cn=Θ(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是第四章的部分习题及答案,希望对你有帮助。 1. 设计一个O(nlogn)时间复杂度的算法,找出一个整数数组中的最大差值,其中最大值必须位于最小值之后。 解答:可以使用分治法,将数组分成两部分,分别求出左边的最大值和右边的最小值,然后比较两个值之间的差值,取最大值即可。具体实现如下: ```python def max_diff(arr): if len(arr) < 2: return 0 mid = len(arr) // 2 left_max = max(arr[:mid]) right_min = min(arr[mid:]) return max(right_min - left_max, max_diff(arr[:mid]), max_diff(arr[mid:])) ``` 2. 设计一个算法,找出一个整数数组中的最大子序列和。 解答:可以使用动态规划法,定义一个状态数组dp,dp[i]表示以第i个元素结尾的最大子序列和,转移方程为:dp[i] = max(dp[i-1] + arr[i], arr[i])。最后返回dp数组中的最大值即可。具体实现如下: ```python def max_subarray(arr): if not arr: return 0 dp = [0] * len(arr) dp[0] = arr[0] for i in range(1, len(arr)): dp[i] = max(dp[i-1] + arr[i], arr[i]) return max(dp) ``` 3. 给定一个长度为n的整数序列,设计一个算法,找出其中第k大的数。 解答:可以使用快速排序的思想,每次选定一个pivot,将数组分成两部分,左边的元素都小于pivot,右边的元素都大于等于pivot。然后比较pivot的位置和k的大小,如果pivot的位置大于k,则在左边继续查找;如果pivot的位置小于k,则在右边继续查找。具体实现如下: ```python def quick_select(arr, k): if not arr or k > len(arr): return None pivot = arr[-1] left = [x for x in arr[:-1] if x < pivot] right = [x for x in arr[:-1] if x >= pivot] if len(right) == k - 1: return pivot elif len(right) > k - 1: return quick_select(right, k) else: return quick_select(left, k - len(right) - 1) ``` 4. 设计一个算法,找出一个无序整数数组中出现次数超过一半的数。 解答:可以使用摩尔投票法,遍历整个数组,维护一个候选数和计数器,如果当前元素等于候选数,则计数器加1;否则计数器减1。如果计数器归零,则将当前元素作为候选数。最后再遍历一遍数组,统计候选数的出现次数,如果出现次数超过一半,则返回该候选数。具体实现如下: ```python def majority_element(arr): if not arr: return None candidate = None count = 0 for num in arr: if count == 0: candidate = num count += (1 if num == candidate else -1) if arr.count(candidate) > len(arr) // 2: return candidate else: return None ``` 5. 设计一个算法,找出一个整数数组中的两个元素,使它们的和等于一个给定的数。 解答:可以使用哈希表,遍历整个数组,对于每个元素,如果它的补数已经在哈希表中,则返回它们的下标;否则将该元素加入哈希表中。具体实现如下: ```python def two_sum(arr, target): if not arr: return None table = {} for i, num in enumerate(arr): complement = target - num if complement in table: return (table[complement], i) else: table[num] = i return None ``` 希望这些答案能够帮助你解决算法设计与分析第四章的部分习题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mitch311

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值