摘要:
2.4.22调整数组大小。在MaxPQ中加入调整数组大小的代码,并和命题Q一样证明对于一般性长度为N的队列其数组访问上限。public class E2d4d22<Key extends Comparable<Key>>{ private Key[] pq; private int N=0; pub 阅读全文
posted @ 2018-10-29 08:51
修电脑的龙生
阅读(297)
评论(0)
推荐(0)
摘要:
2.4.21基础数据结构。说明如何使用优先队列实现第1章中的栈、队列和随机队列这几种数据结构。1)栈的特点是后进先出,入栈时间大的最先出栈,那么可以使用元素的插入时间作为键插入到PQmax队列。2)队列的特点是先进先出,入队时间小的最先出队,那么可以使用元素的插入时间作为键插入到PQmin队列。3) 阅读全文
posted @ 2018-10-29 08:50
修电脑的龙生
阅读(478)
评论(0)
推荐(0)
摘要:
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个大小 阅读全文
posted @ 2018-10-29 08:49
修电脑的龙生
阅读(522)
评论(0)
推荐(1)
摘要:
2.4.18在MaxPQ中,如果一个用例使用insert()插入了一个比队列中的所有元素都大的新元素,随后立即调用delMax()。假设没有重复元素,此时的堆和进行这些操作之前的堆完全相同吗?进行两次insert()(第一次插入一个比队列所有元素都大的元素,第二次插入一个更大的元素)操作接着两次de 阅读全文
posted @ 2018-10-29 08:48
修电脑的龙生
阅读(362)
评论(0)
推荐(0)
摘要:
2.4.19实现MaxPQ的一个构造函数,接受一个数组作为参数。使用正文2.4.5.1节中所述的自底向上的方法构造堆。public class E2d4d19<Key extends Comparable<Key>>{ private Key[] pq; private int N=0; publi 阅读全文
posted @ 2018-10-29 08:48
修电脑的龙生
阅读(307)
评论(0)
推荐(0)
摘要:
2.4.17证明:构造大小为k的面向最小元素的优先队列,然后进行N-k次替换最小元素操作(删除最小元素后再插入元素)后,N个元素中的前k大元素均会留在优先队列中。证:这个命题是错误的。这N个元素中最后剩在最小优先队列中的k个元素中,只有k-1个元素可以保证是N个元素中大者。例如下面这个反例:先使用N 阅读全文
posted @ 2018-10-29 08:47
修电脑的龙生
阅读(302)
评论(0)
推荐(0)
摘要:
2.4.15设计一个程序,在线性时间内检测数组pq[]是否是一个面向最小元素的堆。答:最小元素的堆的特点是所有的非叶子结点都小于等于其直接子结点,换一种说法是除根结点外所有结点都大于等于其父结点。从数组开始到最后,检查除根结点外的所有结点是否大于等于其父结点,只要出现一个结点不满足要求时返回假,除根 阅读全文
posted @ 2018-10-29 08:46
修电脑的龙生
阅读(291)
评论(0)
推荐(0)
摘要:
2.4.16对于N=32,构造数组使得堆排序使用的比较次数最多以及最少。最多比较的情况:堆排序由两个动作实现:1)构建堆2)缩小堆排序数组。反向来看,对于一个已经构建好的大堆,在缩小堆排序数组时要想比较次数最多就需要交换次数最多,要交换次数最多,就需在堆顶元素与堆尾元素交换后下沉最多,要想下沉最多可 阅读全文
posted @ 2018-10-29 08:46
修电脑的龙生
阅读(1588)
评论(0)
推荐(0)
摘要:
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 阅读全文
posted @ 2018-10-29 08:44
修电脑的龙生
阅读(458)
评论(1)
推荐(0)
摘要:
2.4.14对于没有重复元素的大小为N的堆,一次删除最大元素的操作中最少要交换几个元素?构造一个能够达到这个交换次数的大小为15的堆。连续两次删除最大元素呢?三次呢?答:一次删除最大元素操作最少交换下取整(lgN)个元素。证:删除引起的交换发生在N位置的叶结点与根结点的交换和下沉的过程中的交换,下沉 阅读全文
posted @ 2018-10-29 08:44
修电脑的龙生
阅读(345)
评论(0)
推荐(0)
摘要:
2.4.12如果你的应用场景中大量的找出最大元素的操作,但插入元素和删除最大元素操作相对较少,哪种优先队列的实现方法更有效:堆、元序数组、有序数组?答:有序数组。 阅读全文
posted @ 2018-10-29 08:43
修电脑的龙生
阅读(562)
评论(0)
推荐(0)
摘要:
2.4.11如果你的应用中的有大量的插入元素的操作,但只有若干删除最大元素操作,哪种优先队列的实现方法有效:堆、无序数组、有序数组?答:无序数组。 阅读全文
posted @ 2018-10-29 08:41
修电脑的龙生
阅读(555)
评论(0)
推荐(0)
摘要:
2.4.9给出ABCDE五个元素可能构造出来的所有堆,然后给出AAABB这五个元素可能构造出来的所有堆。答:1)ECDAB ECDBA EDCAB EDCBA 2)BBAAA BABAA 阅读全文
posted @ 2018-10-29 08:38
修电脑的龙生
阅读(529)
评论(0)
推荐(0)
摘要:
2.4.10假设我们不想浪费堆有序的数组pq[]中的那那个位置,将最大的元素放在pq[0],它的子结点放在pq[1]和pq[2],以此类推。pq[k]的父结点和子结点在哪里?答:k的父结点位置为 上取整((k-1)/2),子结点位置为2k+1,2k+2 阅读全文
posted @ 2018-10-29 08:38
修电脑的龙生
阅读(260)
评论(0)
推荐(0)
摘要:
2.4.7在堆中,最大的元素一定在位置1上,第二大的元素一定在位置2或者3上。对于一个大小为31的堆,给出第k大的元素可能出现的位置和不可能出现的位置,其中k=2、3、4(设元素值不重复)。解:堆是满树时:堆有f层,f=log(n+1)。以任意结点为根的子树都是满树,以第k大结点为根的子树的最高满子 阅读全文
posted @ 2018-10-29 08:37
修电脑的龙生
阅读(1083)
评论(1)
推荐(1)
摘要:
2.4.8回答上一道练习中第k小元素的可能和不可能的位置。答:设堆有n个元素,堆是满树,n=2^i-1,第k小元素的另一种说法是第n-k+1大元素。再按2.4.7方法求解。 阅读全文
posted @ 2018-10-29 08:37
修电脑的龙生
阅读(243)
评论(0)
推荐(0)
摘要:
2.4.5将EASYQUESTION顺序插入一个面向最大元素的堆中,给出结果。 阅读全文
posted @ 2018-10-29 08:36
修电脑的龙生
阅读(781)
评论(0)
推荐(0)
摘要:
2.4.6按照练习2.4.1的规则,用序列PRIO*R**I*T*Y***QUE***U*E操作一个初始为空的面向最大元素的堆,给出每次操作后堆的内容。 阅读全文
posted @ 2018-10-29 08:36
修电脑的龙生
阅读(360)
评论(0)
推荐(0)
摘要:
2.4.4一个按降序排列的数组也是一个面向最大元素的堆吗?答:是的。因为满足任意节大于它的直接左右子节点,符合大堆定义。 阅读全文
posted @ 2018-10-29 08:33
修电脑的龙生
阅读(537)
评论(0)
推荐(0)
摘要:
2.4.3用以下数据结构实现优先队列,支持插入元素和删除最大元素的操作:无序数组、有序数组、无序链表和链表。将你的4种实现中的每种操作在最坏情况下的运行时间上下限制成一张表格。1)无序数组实现优先队列大堆public class E2d4d3v1<Key extends Comparable<Key 阅读全文
posted @ 2018-10-29 08:32
修电脑的龙生
阅读(1161)
评论(0)
推荐(2)
摘要:
2.4.1用序列PRIO*R**I*T*Y***QUE***U*E(字母表示插入元素,星号表示删除最大元素)操作一个初始为空的优先队列。给出每次删除最 大元素返回字符。 答:RRPOTYIIUQE 阅读全文
posted @ 2018-10-29 08:31
修电脑的龙生
阅读(316)
评论(0)
推荐(0)
摘要:
2.4.2分析以下说法:要实现在常数时间找到最大元素,为何不用一个栈或队列,然后记录已插入的最大元素并在找出最大元素时返回 它的值? 答:如果只是找出一个最大元素,遍历所有元素记录最大者即可,没有必要再花一个栈或队列的空间来存储这些元素。 如果要找出最大元素后,除开这个元素后再继续找最大元素,用一个 阅读全文
posted @ 2018-10-29 08:31
修电脑的龙生
阅读(751)
评论(0)
推荐(0)
摘要:
//按字典次序生成集合的r子集//一个有n个不重复元素的集合的r子集按字典次序排列,它的第一个排列是:123...r//最后一个排列是(n-r+1)...n,从它的第一个排列开始,下一个排列是比当前排列大,//并且是这些大于当前排列中的最小排列,按此规则直到生成最后一个排列为止。//算法具体为:// 阅读全文
posted @ 2018-10-29 08:30
修电脑的龙生
阅读(944)
评论(0)
推荐(0)
摘要:
//按字典次序生成集合的排列//一个有n个不重复元素{123...n}的集合S,有n!个不同排列。//他的最小排列是123...n,最大排列是n(n-1)...1//S的字典次序排列是指从其最小排列123...n开始到最大排列n(n-1)...1为止,//每一个当前排列比下一个排列小。//生成集合S 阅读全文
posted @ 2018-10-29 08:30
修电脑的龙生
阅读(543)
评论(0)
推荐(0)
摘要:
//一个有N个不重复元素的集合的某个子集,可以用这个N个元素中每个元素在或是不在这个子集中来表示。//把这N个元素一字排开,每个位置可以用1来标识对应位置的元素在子集中,用0来标识这个元素不在子集中//依据计数的乘法原理这样的排列数有2^N个,也就是一个有N个不重复元素的集合有2^N个子集。//而这 阅读全文
posted @ 2018-10-29 08:29
修电脑的龙生
阅读(481)
评论(0)
推荐(0)
摘要:
2.3.30极端情况。用初始随机化和非初始随机化的快速排序测试练习2.1.35和练习2.1.36中描述的大型非随机数组。在将这些大数组排序时,乱序对快速排序的性能有何影响?public class E2d3d30{ public static void sort(Comparable[] a,boo 阅读全文
posted @ 2018-10-29 08:28
修电脑的龙生
阅读(236)
评论(0)
推荐(0)
摘要:
2.3.31运行时间直方图。编写一个程序,接受命令行参数N和T,用快速排序对大小为N的随机浮点数数组进行T次排序,并将所有运行时间绘制成直方图。令N=10^3、10^4、10^5和10^6,为了使曲线更平滑,T值越大越好。这个练习最关键的地方在于找到适当的比例绘制出实码结果。1)1000时2)100 阅读全文
posted @ 2018-10-29 08:28
修电脑的龙生
阅读(261)
评论(0)
推荐(0)
摘要:
2.3.29随机化。用经验性的研究对比随机选择切分元素和正文所述的一开始就将数组随机化这两处策略的效果。在子数组大小为M时进行切换,将大小为N的不重复数组排序,其中M=10、20和50,N=10^3、10^4、10^5和10^6。答:由于生成的待排序数组本身已是随机化,方式1在排序前打乱一次数组需要 阅读全文
posted @ 2018-10-29 08:27
修电脑的龙生
阅读(203)
评论(0)
推荐(0)
摘要:
2.3.27忽略小数组。用实验对比以下处理小数组的方法和练习2.3.25的处理方法的效果:在快速排序中直接忽略小数组,仅在快速排序结束后运行一次插入排序。注意:可以通过这些实验估计出电脑的缓存大小,因为当数组大小超出缓存时这种方法的性能可能会下降。public class E2d3d27{ publ 阅读全文
posted @ 2018-10-29 08:26
修电脑的龙生
阅读(156)
评论(0)
推荐(0)
摘要:
2.3.28递归深度。用经验性的研究估计切换阀值为M的快速排序在将大小为N的不重复数组排序时的平均递归深度,其中M=10、20和50,N=10^3、10^4、10^5和10^6。答:通过测试数据得平均递归深度为2.679lg(N/M)public class E2d3d28{ public stat 阅读全文
posted @ 2018-10-29 08:26
修电脑的龙生
阅读(115)
评论(0)
推荐(0)
摘要:
2.3.26子数组大小。编写一个程序,在快速排序处理大小为N的数组的过程中,当子数组的大小小于M时,排序方法需要切换为插入排序。将子数组的大小绘制成直方图。用N=10^5,M=10、20和50测试你的程序。M=10时M=20时M=50时import java.awt.Color;public cla 阅读全文
posted @ 2018-10-29 08:25
修电脑的龙生
阅读(185)
评论(0)
推荐(0)
摘要:
2.3.25切换到插入排序。实现一个快速排序,在子数组元素少于M时切换到插入排序。用快速排序处理大小N分别为10^3、10^4、10^5和10^6的随机数组,根据经验给出使其在你的计算环境中运行速度最快的M值。将M从0变化到30的每个值所得到的平均运行时间绘成曲线。注意:你需要为算法2.2添加一个需 阅读全文
posted @ 2018-10-29 08:24
修电脑的龙生
阅读(228)
评论(0)
推荐(0)
摘要:
2.3.23Java的排序库函数。在练习2.3.22的代码中使用Tukey's ninther方法来找出切分元素--选择三组,每组三个元素,分别取三组元素的中位数,然后取三个中位数的中位数作为切分元素,且在排序小数组时切换到插入排序。public class E2d3d23{ public stat 阅读全文
posted @ 2018-10-29 08:23
修电脑的龙生
阅读(317)
评论(0)
推荐(0)
摘要:
2.3.24取样排序。(W.Frazer,A.McKellar)实现一个快速排序,取样大小为2^k-1.首先将取样得到的元素排序,然后在递归函数中使用样品的中位数切分。分为两部分的其余样品元素无需再次排序并可以分别应用于原数组的两个子数组。这种算法被称为取样排序。2.3.24 Samplesort. 阅读全文
posted @ 2018-10-29 08:23
修电脑的龙生
阅读(523)
评论(0)
推荐(0)

浙公网安备 33010602011771号