代码改变世界

算法导论-B树习题解

2012-03-28 11:59  meteorgan  阅读(827)  评论(1编辑  收藏  举报

18-1 辅存上的栈

  解:a) 最坏情况下,假设是n次PUSH操作,共需2n次磁盘存取,Θ(2m*n)的CPU时间。

    b) 每页有m个字,n次PUSH磁盘存取次数为n/m,CPU时间为Θ(n)。

    c) 假设当前内存中页已满,第一次栈操作为PUSH,则需要换页,需要2次磁盘存取;接着进行两次POP,需要再次换页,需进行1次磁盘存取。接着进行2次PUSH,两次POP,……。

                  存取次数大致为n*(3/2),CPU时间为Θ(mn(3/2)).

         d) 使用磁盘中相邻两页放在内存中实现栈,这样当一页满或空时可以使用另外一页。最坏情况下连续m次PUSH或POP才需换一页。平摊磁盘存取为O(1/m),平摊CPU时间为O(1)。

 

  18-2 连接和分裂2-3-4树

  解:a) 树增高的唯一方法是分裂,而且只有在根节点分裂时树的高度才会增加,这时只需令新的根节点的高度为原根节点高度+1即可,其他节点高度不变; 节点合并是树高度减小的唯一方法,而且是在根节点的两个子节点合并时高度才会减小,这是只需删除根节点即可,其他节点的高度不变。

             b) 比较两棵树的高度,如果height(T') >= height(T''),则在树T' 的第h' - h'' 层的最右边的节点处插入树T''的根节点,沿途要分裂满节点;反之,则用这种方法在树T''的h'' - h'层最左边插入T'的根节点。

     c) T'i-1 = T'i  +1 。  S'' 中树集合间高度与S’ 相同,关键字间关系相反,即 y > k'1  > z 

            d) 从根节点开始查找k,将路径p中的节点分为小于key和大于key的两部分, 这样形成两个树集合T', T'' 。然后利用b)中方法将集合T', T''中的树链接起来。