zoukankan      html  css  js  c++  java
  • 算法导论第六章习题答案(第三版) Introduction to Algorithm

    Exercises

    6.1-1

    最多为2h+1-1个,因为堆是只有最低层未满的二叉树,所以最少也会有2h个元素。

    6.1-2

    根据h≤lgn<h+1,所以h等于lgn的向下取整。

    6.1-3

    因为最大堆的每一层的元素都必定比下一层的大,所以子树所包含的最大元素在该子树的根节点上。

    6.1-4

    最小元素必然在最大堆的页节点上。

    6.1-5 

    6.1-6

    显然不是。

    6.1-7

    显然。

    6.2-1.略。

    6.2-2.略,运行时间应该与MAX-HEAIFY的运行时间一样。

    6.2-3.没什么变化。

    6.2-4.同样没什么变化。

    6.2-5.C/C++ Code:

    void Max_Heapify(int a[],int i){
        int largest;
        while(true){
            if((2*i+1)<=n&&a[i]<a[2*i+1])
                largest=2*i+1;
            else
                largest=i;
            if(2*i+2<=n&&largest<a[2*i+2])
                largest=2*i+2;
            if(largest!=i){
                int temp=a[i];
                a[i]=a[largest];
                a[largest]=temp;
                i=largest;
            }
            else 
                break;
        };
    }

    6.2-6

    最坏情况就是从根节点一直调用到叶子节点,也就是树高lgn,所以最坏运行时间为Ω(lgn)。

    6.3-1.略。

    6.3-2

    调用MAX-HEAPIFY的条件是该结点的左右子树都是最大堆,如果从1到A.length/2递增调用,是无法保证此条件的。

    6.3-3

    6.4-1.略。

    6.4-2

    初始化:i=A.length,子数组A[1...A.length]是一个包含数组A[1...n]中第A.length小元素的最大堆,必然包含,字数组A[i+1...n]是空的,所以包含0个最大元素。

    保持:假设当第i次迭代开始之前,子数组A[1...i+1]是一个包含数组A[1...n]中第i+1小元素的最大堆,子数组A[i...n]包含了数组A[1...n]中已经排序的一个n-i-1个最大元素。此时A[1]为A[1...i+1]中的最大值,为A[1...n]中第i+1小的元素,交换A[1],A[i],此时将A.heap-size减1,A[1...i]中就是一个包含数组A[1...i]中第i小元素的最大堆,而子数组A[i+1]必然是一个排序好的序列。

    终止:终止时i=1,此时堆为空,A[2..n]中包含了数组最大的n-1个元素,显然成立。

    6.4-3

    无论是升序还是降序,都是Θ(nlgn)。

    6.4-5.略。

    6.4-6.略。

    6.5-1.略。

    6.5-2.略。

    6.5-3.略。

    6.5-4

    设置为﹣∞可以对所有的节点进行插入操作,因为该插入操作调用的HEAP-INCEASE-KEY必需保证增加的key大于原来的值。

    6.5-5

    初始化:在第一次循环开始前,A[1...A.heap-size]一定满足最大堆的性质,所以只有A[i]增加到key之后A[i]和A[parent(i)]之间不满足堆的性质。

    保持:假设中间一次循环开始前满足该性质,交换A[i]和A[parent(i)]之后,只有可能导致A[parent(i)]和A[parent(parent(i))]不满足堆的性质,所以下一次循环也就满足该满足该循环不变式终止:i=1或A[i]>A[parent(i)]时循环终止,这两个条件都不会破坏最大堆的性质,应为A[i]没有parent,而A[i]>A[parent(i)]并不破坏堆的性质。

    6.5-6

    利用插入排序的性质,可以很容易得出结论。

    6.5-7

    保证先进入的元素的key值大于后进入key即可实现队列。栈的话反之。

    6.5-8

    对以i为根的堆提取最大值即可。

    6.5-9

    从该堆中提取一个元素,之后再将提取元素的链表中找出下一个元素插入到堆中。

    Thingking Problems

    6-1

    a.不总是一样的。

    b.max-heap-insert的时间复杂度是O(lgn),for循环使其调用n次,所以该算法时间复杂度是O(nlgn)。

    6-2

    a.根据归纳可知,结点i的孩子的范围是[(i-1)d+2,id+2],同理,其父结点的下标为(n-d)/2+1。

    b.logdn=O(lgn)。

    c.d.e.

    同2叉堆基本一致,只是选取在max-heapify中选取最大的时候,要与所有孩子进行比较。

    6-3

    a.略。

    b.根据Young式矩阵的性质,很容易得出。

    c.与堆的操作非常类似,不过堆比较的是左右孩子,Young矩阵比较的是右面和下面的元素。最坏情况就是从左上角的元素一直交换到右下角的元素,这样交换次数为m-1+n-1=m+n-1,所以为O(m+n)。T(p)≤T(max(m,n))+Θ(1)。

    d.与堆的插入操作同样类似,与上方和左方的元素进行比较,时间复杂度是O(m+n)。

    e.先构造Young氏矩阵,对n2个元素进行插入操作,每个插入操作的时间复杂度是O(n+n),所以需O(n3),之后再取每个元素的最小值,复杂度也同样是O(n3)。这样即可排序。

    f.与右面与下面元素依次比较大小即可,来决定是向右走还是向左走,最坏情况就是从左上角走到右下角。共需进行O(m+n)次比较。

  • 相关阅读:
    老年人微信教程手绘版|微信入门教程1
    微信网页版朋友圈在哪?怎么找不到
    如何用<dl>标签做表格而不用table标签
    600万个!520元的微信红包发了这么多!
    微信红包最高能发520元啦!只限今天!
    微信和WeChat的合并月活跃账户数达到7.62亿了
    excel隔行选中内容如何操作
    各大公司广泛使用的在线学习算法FTRL详解
    在线最优化求解(Online Optimization)之五:FTRL
    在线最优化求解(Online Optimization)之四:RDA
  • 原文地址:https://www.cnblogs.com/hlj-ljz/p/3393347.html
Copyright © 2011-2022 走看看