算法导论第九章练习参考答案(16) - 9.1-9.3

2024-3-15  于学业抽出空闲再次拾起算法导论练习的答案翻译,学习无止境

悟已往之不谏,知来者之可追。 --  陶渊明

过去无可挽回,未来可以改变,现在明白这些还不是很晚,应当知道今天该做什么还没做,昨天不该做什么却做了。

Exercise 9.1-1 

在这个问题中,我们将递归地把数组分成两个大小相等的元素集,我们将忽略取下限和上限。分析是一样的,但如果我们不假设n是2的幂,就有点难看了。

把元素分解成不相交的对。然后,比较每对,只考虑每对中最小的元素。从这一组元素中,原始问题的结果要么是与最小元素配对的元素,要么是子问题中第二小的元素。这样做会得到最小和第二小的元素。我们得到递归式T(n) = T(n/2)+n/2+1和T(2) = 1。求解这个递归式,我们将使用替换法T(n)\leq n+\left \lceil lg(n) \right \rceil- 2,它符合基本情况,T(n) = n/2+T(n/2)+1\leq n/2+n/2+\left \lceil lg(n/2) \right \rceil - 2+1 =n+\left \lceil lg(n/2) \right \rceil - 2

 Exercise 9.1-2

最初,所有n个数都可能是最大值或最小值。设MAX为可能是最大值的数的集合,MIN为可能是最小值的数的集合。假设我们比较两个元素a和b,如果a≤b,我们可以将a从MAX中移除,将b从MIN中移除,因此我们将两个集合的计数都减少1。如果我们比较MIN中的两个元素,我们将MIN的大小减少1,如果我们比较MAX中的两个元素,我们可以将MAX的大小减少1。因此,第一种比较是最优的。在MIN和MAX不相交之前,可以进行\left \lceil n/2 \right \rceil这样的比较,并且集合的大小将为\left \lceil n/2 \right \rceil\left \lfloor n/2 \right \rfloor。在每一种比较中,只能进行第二和第三种比较,每一种比较都将集合大小减少1,所以我们总共需要\left \lceil n/2 \right \rceil-1+\left \lfloor n/2 \right \rfloor=n-2次比较。将其添加到初始的\left \lceil n/2 \right \rceil比较中,得到\left \lceil 3n/2 \right \rceil-2。 


Exercise 9.2-1 

调用零长度数组意味着第二个和第三个参数是相等的。因此,如果调用在第8行进行,我们需要p = q−1。这意味着q−p + 1 = 0。然而,假设i是一个非负数,并且要执行第8行,我们需要

i < k = q−p + 1 = 0,这是一个矛盾。另一种可能是错误的递归调用发生在第9行。这意味着q + 1 = r,为了执行第9行,我们需要它
i > k = q−p + 1 = r−p.这将是对数组的一个无意义的原始调用,因为我们要求从一个严格较小的数组中获取第i个元素。 

Exercise 9.2-2 

当我们知道k - 1和n - k的最大值时Xk等于1的概率是不变的。换句话说,P(Xk = a| max(k−1,n−k) = m) = P(Xk = a)对于a = 0,1和m = k−1,n−k,所以Xk和max(k−1,n−k)是独立的。在C.3-5中,Xk和T(max(k−1,n−k))也是如此。 

Exercise 9.2-3 

  

 Exercise 9.2-4

当选择的分区总是数组的最大元素时,我们会得到最差的性能。在这个例子中,序列将是9,8,7,6,5,4,3,2,1,0。 


 Exercise 9.3-1

如果它们被分成7个一组,它仍然成立,因为我们仍然知道中位数的中位数至少小于一半的\left \lceil n/7 \right \rceil组中的4个元素,所以,它大约大于4n/14个元素。同样,它也小于4n/14个元素。所以,我们永远不会对超过10n/14个元素递归调用它。所以T(n)≤T(n/7) + T(10n/14) + O(n)我们可以通过替换来证明它是线性的。设n < k时T(n) < cn,则m≥k时,T(m)≤T(m/7) + T(10m/14) + O(m)≤cm(1/7 + 10/14) + O(m)。所以,只要我们有隐藏在大哦符号中的常数小于c/7,我们就得到了我们想要的结果。 

假设现在我们使用大小为3的组。同理,我们得到的递归式是T(n) = T(\left \lceil n/3 \right \rceil) + T(4n/6) + O(n)≥T(n/3) + T(2n/3) + O(n)我们会证明它≥cn lg(n)。

T(m)≥c(m/3) lg(m/3) + c(2m/3) lg(2m/3) + O(m)≥cm lg(m) + O(m)。所以,我们知道它比线性增长更快。

 Exercise 9.3-2

我们知道,大于等于x的元素个数和小于等于x的元素个数至少为3n/10−6。当n≥140时,我们有。 

Exercise 9.3-3 

我们可以修改快速排序,让它在最坏的情况下运行nlg (n)时间通过快速选择选择主元素为中位数。然后,我们就可以保证我们的主点是正确的,并且找到中位数所花费的时间和剩下的分划的时间是一样的。

Exercise 9.3-4 

如果在算法中比较数组的第i和第j个元素,我们发现A[i]≥A[j],则创建一个有n个顶点的图,并绘制从顶点i到顶点j的有向边。注意,如果图中存在从x到i的路径,则A[i]是i−1个较小元素中的一个,如果图中存在从i到x的路径,则A[i]是n−i个较大元素中的一个。每个顶点i必须要么位于到x的路径上,要么位于从x的路径上,否则算法无法区分i≤x和i≥x。而且,如果一个顶点i既位于到x的路径上,又位于从x的路径上,那么它必须满足x≤A[i]≤x,因此x = A[i]。在这种情况下,我们可以任意地打破联系。

Exercise 9.3-5 

要使用它,只要找到中位数,根据这个中位数划分数组。如果i小于原始数组长度的一半,则对前一半进行递归,如果i是数组长度的一半,则返回来自中位数查找黑箱的元素。最后,如果i大于数组长度的一半,则减去数组长度的一半,然后对数组的另一半进行递归。 

Exercise 9.3-6

在不失一般性的前提下,假设n和k是2的幂。我们首先使用SELECT在O(n)时间内找到n/2阶统计量,然后将问题简化为寻找较小的n/2个元素的k/2个分位数和较大的n/2个元素的k/2个分位数。设T(n)表示算法在大小为n的输入上运行所需的时间。那么对于某个常数c, T(n) = cn + 2T(n/2),基本情况是T(n/k) = O(1)。然后我们有: 

Exercise 9.3-7 

求线性时间内n/2−k/2个最大的元素。对该元素进行分区。然后,在由分区形成的更大的子数组中找到第k个最大的元素。然后,在此元素上划分的较小子数组中的元素是所需的k个数。 

Exercise 9.3-8 

在不失一般性的前提下,假设n是2的幂。

  

 Exercise 9.3-9

如果n是奇数,那么我们选择主管道的y坐标等于所有井的y坐标的中值。如果n是偶数,那么,我们可以选择管道的y坐标是介于井的y坐标之间的任意点,其y坐标的阶统计量为\left \lfloor (n+ 1)/2 \right \rfloor\left \lceil (n+1)/2) \right \rceil。这些都可以使用本节中的算法在线性时间内找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值