摘要:
2.4.22调整数组大小。在MaxPQ中加入调整数组大小的代码,并和命题Q一样证明对于一般性长度为N的队列其数组访问上限。public class E2d4d22<Key extends Comparable<Key>>{ private Key[] pq; private int N=0; pub 阅读全文
摘要:
2.4.21基础数据结构。说明如何使用优先队列实现第1章中的栈、队列和随机队列这几种数据结构。1)栈的特点是后进先出,入栈时间大的最先出栈,那么可以使用元素的插入时间作为键插入到PQmax队列。2)队列的特点是先进先出,入队时间小的最先出队,那么可以使用元素的插入时间作为键插入到PQmin队列。3) 阅读全文
摘要:
2.4.20证明:基于下沉的堆构造方法使用的比较次数小于2N,交换次数小于N。 证: 使用sink方法构造一个N个元素的堆,最坏情况下需要处理 N/2/2个大小为3=2^2-1堆, N/2/2/2个大小为7=2^3-1的堆, N/2/2/2/2个大小为15=2^4-1的堆, ... N/2^i个大小 阅读全文
摘要:
2.4.18在MaxPQ中,如果一个用例使用insert()插入了一个比队列中的所有元素都大的新元素,随后立即调用delMax()。假设没有重复元素,此时的堆和进行这些操作之前的堆完全相同吗?进行两次insert()(第一次插入一个比队列所有元素都大的元素,第二次插入一个更大的元素)操作接着两次de 阅读全文
摘要:
2.4.19实现MaxPQ的一个构造函数,接受一个数组作为参数。使用正文2.4.5.1节中所述的自底向上的方法构造堆。public class E2d4d19<Key extends Comparable<Key>>{ private Key[] pq; private int N=0; publi 阅读全文
摘要:
2.4.17证明:构造大小为k的面向最小元素的优先队列,然后进行N-k次替换最小元素操作(删除最小元素后再插入元素)后,N个元素中的前k大元素均会留在优先队列中。证:这个命题是错误的。这N个元素中最后剩在最小优先队列中的k个元素中,只有k-1个元素可以保证是N个元素中大者。例如下面这个反例:先使用N 阅读全文
摘要:
2.4.15设计一个程序,在线性时间内检测数组pq[]是否是一个面向最小元素的堆。答:最小元素的堆的特点是所有的非叶子结点都小于等于其直接子结点,换一种说法是除根结点外所有结点都大于等于其父结点。从数组开始到最后,检查除根结点外的所有结点是否大于等于其父结点,只要出现一个结点不满足要求时返回假,除根 阅读全文
摘要:
2.4.16对于N=32,构造数组使得堆排序使用的比较次数最多以及最少。最多比较的情况:堆排序由两个动作实现:1)构建堆2)缩小堆排序数组。反向来看,对于一个已经构建好的大堆,在缩小堆排序数组时要想比较次数最多就需要交换次数最多,要交换次数最多,就需在堆顶元素与堆尾元素交换后下沉最多,要想下沉最多可 阅读全文
摘要:
2.4.13想办法在sink()中避免检查j<N。答:在delMax中,pq[N+1]=null变更成pq[N+1]=无穷小哨兵值,j<N时,j<N && less(j,j+1) =真&&less(j,j+1)=less(j,j+1)j=N时,j<N && less(j,j+1)=假&&假=假=le 阅读全文
摘要:
2.4.14对于没有重复元素的大小为N的堆,一次删除最大元素的操作中最少要交换几个元素?构造一个能够达到这个交换次数的大小为15的堆。连续两次删除最大元素呢?三次呢?答:一次删除最大元素操作最少交换下取整(lgN)个元素。证:删除引起的交换发生在N位置的叶结点与根结点的交换和下沉的过程中的交换,下沉 阅读全文
摘要:
2.4.12如果你的应用场景中大量的找出最大元素的操作,但插入元素和删除最大元素操作相对较少,哪种优先队列的实现方法更有效:堆、元序数组、有序数组?答:有序数组。 阅读全文
摘要:
2.4.11如果你的应用中的有大量的插入元素的操作,但只有若干删除最大元素操作,哪种优先队列的实现方法有效:堆、无序数组、有序数组?答:无序数组。 阅读全文
摘要:
2.4.9给出ABCDE五个元素可能构造出来的所有堆,然后给出AAABB这五个元素可能构造出来的所有堆。答:1)ECDAB ECDBA EDCAB EDCBA 2)BBAAA BABAA 阅读全文
摘要:
2.4.10假设我们不想浪费堆有序的数组pq[]中的那那个位置,将最大的元素放在pq[0],它的子结点放在pq[1]和pq[2],以此类推。pq[k]的父结点和子结点在哪里?答:k的父结点位置为 上取整((k-1)/2),子结点位置为2k+1,2k+2 阅读全文
摘要:
2.4.7在堆中,最大的元素一定在位置1上,第二大的元素一定在位置2或者3上。对于一个大小为31的堆,给出第k大的元素可能出现的位置和不可能出现的位置,其中k=2、3、4(设元素值不重复)。解:堆是满树时:堆有f层,f=log(n+1)。以任意结点为根的子树都是满树,以第k大结点为根的子树的最高满子 阅读全文
摘要:
2.4.8回答上一道练习中第k小元素的可能和不可能的位置。答:设堆有n个元素,堆是满树,n=2^i-1,第k小元素的另一种说法是第n-k+1大元素。再按2.4.7方法求解。 阅读全文
摘要:
2.4.5将EASYQUESTION顺序插入一个面向最大元素的堆中,给出结果。 阅读全文
摘要:
2.4.6按照练习2.4.1的规则,用序列PRIO*R**I*T*Y***QUE***U*E操作一个初始为空的面向最大元素的堆,给出每次操作后堆的内容。 阅读全文
摘要:
2.4.4一个按降序排列的数组也是一个面向最大元素的堆吗?答:是的。因为满足任意节大于它的直接左右子节点,符合大堆定义。 阅读全文
摘要:
2.4.3用以下数据结构实现优先队列,支持插入元素和删除最大元素的操作:无序数组、有序数组、无序链表和链表。将你的4种实现中的每种操作在最坏情况下的运行时间上下限制成一张表格。1)无序数组实现优先队列大堆public class E2d4d3v1<Key extends Comparable<Key 阅读全文