算法导论第十章练习参考答案(18) - 10.1-10.4

 Exercise 10.1-1 

 Exercise 10.1-2

我们将栈命名为T和R。首先,设置T.top = 0和R.top = n + 1。实际上,栈T使用数组的第一部分,栈R使用数组的最后一部分。在栈T中,top是T中最右边的元素。在栈R中,top是R中最左边的元素。

  Exercise 10.1-3

  

 Exercise 10.1-4

 Exercise 10.1-5

 在本节给出的示例代码中,我们将忽略检查溢出和下溢错误。

  Exercise 10.1-6

enqueue操作与将一个元素压入栈1的操作相同。这个操作是O(1)。要脱离队列,从栈2取出一个元素。如果栈2是空的,对于栈1中的每个元素,我们取出它,然后将它压入栈2。最后,从栈2中取出最上面的项。在最坏的情况下,这个操作是O(n)。 

  Exercise 10.1-7

下面是一种使用两个队列实现堆栈的方法,其中pop需要线性时间,push需要常数时间。第一种方法是在推入每个元素时将其排队。然后,要执行弹出操作,需要从一个队列中取出每个元素,并将其放置在另一个队列中,但在最后一个元素之前停止。然后,返回原始队列中剩下的单个元素。 


Exercise 10.2-1 

 

要在常量时间内插入一个元素,只需将其添加到头部,使其指向旧的头部,并使其成为头部。要删除一个元素,需要线性时间,因为如果不从头开始扫描,就无法获得指向列表中前一个元素的指针。

 Exercise 10.2-2

PUSH(L,x)操作与LIST-INSERT(L,x)完全相同。POP操作设置x等于L.head,调用LIST-DELETE(L,L.head),然后返回x。 

Exercise 10.2-3 

 

除了表头,还要保留一个指向链表最后一个元素的指针。要排队,请在列表的最后一个元素之后插入元素,并将其设置为新的最后一个元素。要退出队列,请删除列表的第一个元素并返回它。 

 Exercise 10.2-4

首先让L.nil.key = k,然后像往常一样运行LIST-SEARCH ',但是去掉x\neq L.nil的检查。 

 Exercise 10.2-5

要插入,只需在常量时间内,在当前头之前插入列表。要搜索,从头部开始,检查元素是否为正在检查的当前节点,检查下一个元素,依此类推,直到列表末尾或找到元素。在最坏的情况下,这可能需要线性时间。要删除,再次使用线性时间,因为没有办法立即到达该元素
在当前元素之前,而不是从头部开始并沿着列表。 

 Exercise 10.2-6

设L1是包含S1元素的双链表,L2是包含S2元素的双链表。我们实现UNION的方式如下:设置L1.nil.prev.next = L2.nil.next和L2.nil.next.prev = L1.nil.prev,使得L1的最后一个元素紧跟着L2的第一个元素。然后设置l1.nil.prev = L2.nil.prev.和L2.nil.prev.next = L1.nil,所以L1.nil是包含L1和L2中所有元素的双链表的哨兵。 

 Exercise 10.2-7

Exercise 10.2-8 

为了方便,我们将单独存储L.head的指针值。一般来说,A XOR (A XOR C) = C,所以一旦我们知道了一个指针的true值,就可以通过应用该规则恢复所有其他指针(即L.head)。假设列表中至少有两个元素,第一个元素将包含第二个元素的精确地址。 

要反转列表,我们只需要将头元素作为L.nil之前的“最后”元素,而不是在此之后的第一个元素。这可以通过设置L.head =L.nil.np XOR L.head来实现。 


 Exercise 10.3-1

多数组版本可以是L = 2,

一个数组的版本可以是L = 4,

Exercise 10.3-2 

Exercise 10.3-3

分配Allocate对象只返回一些单元格的索引,它保证在它们被释放之前不会再给出索引。prev属性不会被修改,因为内存管理器只使用next属性,这取决于调用allocate的代码是否使用它认为合适的prev和key属性。

 Exercise 10.3-4

对于ALLOCATE-OBJECT,我们将跟踪数组中下一个可用的位置,并且它总是比存储的元素数量大1。对于FREE-OBJECT(x),当释放一个空间时,将大于x的每个元素的位置减1,并相应地更新指针。这需要线性时间。 

  Exercise 10.3-5

 

参见算法COMPACTIFY−LIST(L, F) 


 Exercise 10.4-1 

 

注意,数组中的索引8和2没有出现,而且实际上并不表示有效的树。 

Exercise 10.4-2

 

 参见算法PRINT-TREE。

Exercise 10.4-3 

 

Exercise 10.4-4 

 

 参见算法PRINT-TREE。

Exercise 10.4-5

 参见INORDER-PRINT ' (T)算法。

Exercise 10.4-6 

我们的两个指针分别是左和右。对于节点x, x. left将指向x最左边的子节点,如果x有兄弟节点,则x.right将指向紧邻其右侧的兄弟节点,否则则指向x的父节点。我们的布尔值b,存储在x处,b = depth(x) mod 2。要到达节点的父节点,只需一直跟随“右”指针,直到布尔值的奇偶校验发生变化。要查找节点的所有子节点,首先查找x. left,然后跟踪“右”指针,直到布尔值的奇偶校验发生变化,忽略最后一个节点,因为它将是x。

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值