算法导论第十章思考题参考答案(19)

 Ploblem 10-1

对于每一个,我们假设排序意味着按升序排序。

  Ploblem 10-2

在这三种情况下,MAKE-HEAP只是创建一个新的列表L,设置L.head =NIL,并在常量时间内返回L。假设列表是双向链接的。要将链表实现为堆,我们可以想象通常的二进制堆的数组实现,其中第i元素的子元素是2i和2i + 1。

a.为了插入,我们执行线性扫描以查看插入元素的位置,从而使列表保持有序。这需要线性时间。列表中的第一个元素是最小元素,我们可以在常数时间内找到它。Extract-min返回列表的第一个元素,然后删除它。Union在两个已排序的列表之间执行合并操作,使它们的条目交错,从而使结果列表排序。这需要的时间是两个列表长度和的线性关系。

b.将元素x插入到堆中,开始线性扫描列表,直到元素y的第一个实例严格大于x。如果不存在这样大的元素,只需在列表末尾插入x。如果y确实存在,则用x代替yt。这保持了最小堆的性质,因为x≤y并且y比它的每一个子元素都小,所以x也必须如此。而且,x比它的父元素大,因为y是列表中第一个超过x的元素。现在插入y,从x后面的节点开始扫描。因为我们最多检查每个节点一次,所以时间在列表的大小上是线性的。要获得最小元素,在常量时间内返回列表头的键。

要提取最小元素,我们首先调用MINIMUM。接下来,我们将用列表中第二个最小元素y的键替换列表头部的键。我们将获取存储在列表末尾的键,并用它来替换y的键。最后,我们将删除列表的最后一个元素,并在列表上调用MIN-HEAPIFY。要用链表实现这一点,我们需要遍历列表,从元素i到元素2i。我们从代码中省略了这个细节,但是我们将在运行时分析中考虑它。因为调用MIN-HEAPIFY的i的值总是在增加,而且我们不需要多次遍历元素,所以运行时间在列表的长度上是线性的。
下面实现了联合,我们假设A和B是要合并的堆的两个列表表示。运行时在要合并的列表的长度上也是线性的。

c.由于b部分的算法不依赖于元素的不同,我们可以使用相同的。

  Ploblem 10-3

a.如果原始版本的算法只需要t次迭代,那么,我们知道它最多只能随机跳过列表以获得所需的值,因为原始while循环的每次迭代都可能是随机跳转,然后是通过链表的正常步骤。

b.第2-7行的for循环将运行t次,每次运行时间都是恒定的。之后,第8-9行中的while循环将正好运行Xt次。所以,总运行时间是O(t + E[Xt])。 

c.利用方程c. 25,我们得到。所以我们需要证明。这可以看出,因为当Xt大于i时,意味着每个随机选择将导致一个元素在所需元素之前至少i步,或者在所需元素之后。总共有n - i个这样的元素,在我们所选取的n个元素中。因此,对于在这个范围内的单个选项,我们有(n - i)/n = (1 - i/n)的概率。因为每个选择都是独立的,所以所有选择都是独立的总概率是(1 - i/n)^t,如预期的那样。最后,我们可以注意到,由于链表的长度为n,所以Xt大于n的概率等于零。 

d.既然t > 0,我们知道函数f(x) = x^t是递增的,所以,这意味着\left \lfloor x \right \rfloor^{t} \leq f(x)。所以,

e.f.我们把b和e放在一起得到它在时间O(t+n/(t+1))内运行。这和O(t + n/t)是一样的。

g.因为我们知道对于任意迭代次数t,第一个算法需要找到它的答案,第二个算法将在时间O(t + n/t)内返回答案。特别地,如果我们有t =√n。第二种算法只需要O(√n)的时间。这意味着第一个列表搜索算法也是O(√n)。

h.如果我们没有不同的键值,那么,我们可以随机选择一个比之前更远的元素,但不会跳转到它,因为它与我们当前所在的键值相同。当我们试图限定Xt≥i的概率时,分析就会中断。

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值