摘要:
1.5.22Erods-renyi模型的倍率实验。开发一个性能测试用例 ,从命令行接受一个int值T并进行T次以下实验:使用练习1.5.17的用例生成随机连接,和我们的开发用例一样使用UnionFind来检查触点的连通性,不断循环直到所有触点均相互连通。对于每个N,0打印出N值和平均所需的连接数以及 阅读全文
posted @ 2018-10-26 10:22
修电脑的龙生
阅读(455)
评论(3)
推荐(0)
摘要:
1.5.23在Erdos-Renyi模型下比较quick-find算法和quick-union算法。开发一个性能测试用例,从命令行接受一个int值T并进行T次以下实验:使用练习1.5.17的用例生成随机连接。保存这些连接并和我们的开发用例一样分别用quikc-find算法和quick-union算法 阅读全文
posted @ 2018-10-26 10:22
修电脑的龙生
阅读(242)
评论(0)
推荐(0)
摘要:
1.5.20动态生长。使用链表或大小可变的数组实现加权quick-union算法,去掉需要预先知道对象数量的限制。为API添加一个新方法netwSite(),它应该返回一个类型为int的标识符。答:1)第一对p,q加入时,新增两个节点,设置p为q的父节点。2)第一对之后的每一对p,q加入时,需要先判 阅读全文
posted @ 2018-10-26 10:21
修电脑的龙生
阅读(171)
评论(0)
推荐(0)
摘要:
1.5.21Erdos-renyi模型。使用练习1.5.17的用例验证这个猜想:得到单个连通分量所需生成的整数对数量为~1/2NlnN。public class E1d5d21{ public static void main(String[] args) { int T=Integer.parse 阅读全文
posted @ 2018-10-26 10:21
修电脑的龙生
阅读(638)
评论(0)
推荐(0)
摘要:
1.5.20动态生长。使用链表或大小可变的数组实现加权quick-union算法,去掉需要预先知道对象数量的限制。为API添加一个新方法netwSite(),它应该返回一个类型为int的标识符。public class WeightedQuickUnionUFofDynamicWithArray{ 阅读全文
posted @ 2018-10-26 10:20
修电脑的龙生
阅读(256)
评论(0)
推荐(0)
摘要:
1.5.19动画。编写一个RandomGrid(请见练习1.5.18)的用例,和我们开发用例一样使用UnionFind来检查触点的连通性并在处理的同时用StdDraw将它们绘出。答:书上的连通性太美,这里太挫了。 public class RandomGridAnimation{ public st 阅读全文
posted @ 2018-10-26 10:19
修电脑的龙生
阅读(213)
评论(0)
推荐(0)
摘要:
1.5.18随机网格生成器。编写一个程序RandomGrid,从命令行接受一个int值N,生成一个NXN的网格中的所有连接。它们的排列随机且方向随机(即(p q)和(q p)出现的可能性是相等的),将这个结果打印到标准输出中。可以使用RandomBag将所有连接随机排列(请见练习1.3.34),并使 阅读全文
posted @ 2018-10-26 10:17
修电脑的龙生
阅读(346)
评论(0)
推荐(0)
摘要:
1)QuickFindUF(1000点)2)QuickUnionUF(1000点)3)WeightedQuickFindUF(2000点)4)WeightedQuickUnionUF(1000点)CODE:public class QuickFindUF{ private int[] id; pri 阅读全文
posted @ 2018-10-26 10:16
修电脑的龙生
阅读(441)
评论(0)
推荐(0)
摘要:
1.5.17随机连接。设计UF的一个用例 ErdosRenyi,从命令行接受一个整数N,在0到N-1之间产生随机整数对,调用connected()判断它们是否相连,如果不是则调用union()方法(和我们的开发用例一样)。不断循环直到所有触点均相互连通并打印出生成的连接总数。将你的程序打包成一个接受 阅读全文
posted @ 2018-10-26 10:16
修电脑的龙生
阅读(270)
评论(0)
推荐(0)
摘要:
1.5.15二项树。请证明,对于加权quick-union算法,在最坏情况下树中每一层的节点数均为二项式系数。在这种情况下,计算含有N=2^n个节点的树中节点的平均深度。答:1)最坏情况是指在指定的节点数目下构建最大深度的树,要构建最大深度的树就需要在树的每次合并都会使合并后的树高度增加,要使两棵树 阅读全文
posted @ 2018-10-26 10:15
修电脑的龙生
阅读(499)
评论(0)
推荐(0)
摘要:
1.5.14根据高度加权的quick-union算法。给出UF的一个实现,使用和加权quick-union算法相同的策略,但记录的是树的高度并不总是将较矮的树连接到较高的树上 。用算法证明N个触点的树的高度不会超过其大小的对数级别。答:暂未证明。public class E1d5d14{ priva 阅读全文
posted @ 2018-10-26 10:14
修电脑的龙生
阅读(307)
评论(0)
推荐(0)
摘要:
1.5.12使用路径压缩的quick-union算法。根据路径压缩修改quick-union算法(请见1.5.2.3节),在find()方法中添加一个循环来将从p到根节点的路径上的每个触点都连接到根节点。给出一列输入,使该方法能够产生一条长度为4的路径。注意:该算法的所有操作的均摊成本已知为对数级别 阅读全文
posted @ 2018-10-26 10:13
修电脑的龙生
阅读(502)
评论(1)
推荐(0)
摘要:
1.5.13使用路径压缩的加权quick-union算法。修改加权quick-union算法(算法1.5),实现如练习1.5.12所述的路径压缩。给出一列输入,使该方法能够产生一棵高度为4的树。注意:访算法的所有操作的均摊成本已知被限制在反Ackermann函数的范围之内,且对于实际应用中可能出现的 阅读全文
posted @ 2018-10-26 10:13
修电脑的龙生
阅读(797)
评论(0)
推荐(0)
摘要:
1.5.11实现加权quick-find算法,其中我们总是将较小的分量重命名为较大的分量的标识符。这种改变会对性能产生怎样的影响?答:每次union需要多访问N次id数组进行判断,同时还需要对两个分量的触点个数的sz赋新值,也会增加数组的访问,性能将会降低。public class E1d5d11{ 阅读全文
posted @ 2018-10-26 10:12
修电脑的龙生
阅读(282)
评论(0)
推荐(0)
摘要:
1.5.10在加权quick-union算法中,假设我们将id[find(p)]的值设为q而非id[find(q)],所得的算法是正确的吗? 答:是,但这会增加树的高度,因此无法保证同样的性能。 阅读全文
posted @ 2018-10-26 10:05
修电脑的龙生
阅读(114)
评论(0)
推荐(0)
摘要:
1.5.8用一个反例证明quick-find算法中的union()方法的以下直观实现是错误的: public void union(int p,int q) { if (connected(p,q) return; //将p的分量重命名为q的分量 for (int i=0;i<id.length;i 阅读全文
posted @ 2018-10-26 10:04
修电脑的龙生
阅读(247)
评论(0)
推荐(0)
摘要:
1.5.9画出下面的id[]数组所对应的树。这可能是加权quick-union算法得到的结果吗?解释为什么不可能,或者给出能够得到访数组的一系列操作。 i 0 1 2 3 4 5 6 7 8 9 id[i] 1 1 3 1 5 6 1 3 4 5 答:如果是加权quick-union得到的树最大深度 阅读全文
posted @ 2018-10-26 10:04
修电脑的龙生
阅读(146)
评论(0)
推荐(0)
摘要:
1.5.7分别为quick-find算法和quick-union算法实现QuickFindUF类和QuickUnionUF类。 public class QuickFindUF { private int[] id; private int count; public QuickFindUF(int 阅读全文
posted @ 2018-10-26 10:03
修电脑的龙生
阅读(233)
评论(0)
推荐(0)
摘要:
1.5.6使用加权quick-union算法完成练习1.5.5。 1.5.6使用加权quick-union算法完成练习1.5.5。 1.5.6使用加权quick-union算法完成练习1.5.5。 阅读全文
posted @ 2018-10-26 10:02
修电脑的龙生
阅读(119)
评论(0)
推荐(0)
摘要:
1.5.5在一台每秒能够处理10^9条指令的计算机上,估计quick-find算法解决含有10^9个触点和10^6条连接的动态连通性问题所需的最短时间内循环for的每一次迭代需要执行10条机器指令。 阅读全文
posted @ 2018-10-26 10:01
修电脑的龙生
阅读(150)
评论(0)
推荐(0)
摘要:
1.5.4在正文的加权quick-union算法示例中,对于输入的每一对整数(包括对照输入和最坏情况下的输入),给出id[]和sz[]数组的内容以及访问数组的次数。答:1)示例:2)对照输入:3)最坏输入4)code:public class WeightedQuickUnionUF{ privat 阅读全文
posted @ 2018-10-26 10:00
修电脑的龙生
阅读(173)
评论(0)
推荐(0)
摘要:
1.5.3使用加权quick-union算法(请见算法1.5)完成练习1.5.1。 1.5.3使用加权quick-union算法(请见算法1.5)完成练习1.5.1。 1.5.3使用加权quick-union算法(请见算法1.5)完成练习1.5.1。 阅读全文
posted @ 2018-10-26 10:00
修电脑的龙生
阅读(304)
评论(0)
推荐(0)
摘要:
1.5.2使用quick-union算法(请见1.5.2.3节代码框)完成练习1.5.1。另外,在处理完输入的每对整数之后画出id[]数组表示的森林。答:public class UF{ private int[] id; private int count; public UF(int N) { 阅读全文
posted @ 2018-10-26 09:55
修电脑的龙生
阅读(500)
评论(0)
推荐(0)
摘要:
1.5.1使用quick-find算法处理序列9-0 3-4 5-8 7-2 2-1 5-7 0-3 4-2。对于输入的每一对整数,给出id[]数组的内容和访问数组的次数。答:public class UF{ private int[] id; private int count; public U 阅读全文
posted @ 2018-10-26 09:54
修电脑的龙生
阅读(647)
评论(0)
推荐(0)
摘要:
public class WeightedQuickUnionUF{ private int[] id; private int[] sz; private int count; public WeightedQuickUnionUF(int N) { count=N; id=new int[N]; 阅读全文
posted @ 2018-10-26 09:53
修电脑的龙生
阅读(127)
评论(0)
推荐(0)
摘要:
public class UF{ private int[] id; private int count; public UF(int N) { count=N; id=new int[N]; for (int i=0;i<N;i++) id[i]=i; } public int count() { 阅读全文
posted @ 2018-10-26 09:52
修电脑的龙生
阅读(122)
评论(0)
推荐(0)
摘要:
public class UF{ private int[] id; private int count; public UF(int N) { count=N; id=new int[N]; for (int i=0;i<N;i++) id[i]=i; } public int count() { 阅读全文
posted @ 2018-10-26 09:46
修电脑的龙生
阅读(111)
评论(0)
推荐(0)
摘要:
1.4.45优惠券收集问题。用和上一题相同的方式生成随机整数。通过实验验证生成所有可能的整数值所需生成的随机数总量为~N HN 。答:HN表示递推关系。通过以下实验结果观察得出Hn接近于一个等差数列。public class E1d4d45{ public static void main(Stri 阅读全文
posted @ 2018-10-26 09:45
修电脑的龙生
阅读(146)
评论(0)
推荐(0)
摘要:
1.4.44生日问题。编写一个程序,从命令行接受一个整数N作为参数并使用StdRandom.uniform()生成一系列0至N-1之间的随机整数。通过实验验证产生第一个重复的随机数之前生成的整数数量为~sqrt(pi*N/2)。答:public class E1d4d44{ public stati 阅读全文
posted @ 2018-10-26 09:44
修电脑的龙生
阅读(224)
评论(0)
推荐(0)
摘要:
1.4.43大小可变的数组与链表。通过实验验证对于栈来说基于大小可变的数组的实现快于基于链表的实现的猜想(请见练习1.4.35和练习1.4.36)。为此实现另一个版本的Doublingratio,计算两个程序的运行时间的比例。答:public class E1d4d43{ public static 阅读全文
posted @ 2018-10-26 09:39
修电脑的龙生
阅读(209)
评论(0)
推荐(0)
摘要:
1.4.42问题规模。设在你的计算机上用TwoSumFast、TwoSum、TreeSumFast以用ThreeSum能够处理的问题的规模为2^pX10^3个整数。使用Doublingratio估计P的最大值。 答: 阅读全文
posted @ 2018-10-26 09:38
修电脑的龙生
阅读(169)
评论(0)
推荐(0)
摘要:
1.4.41运行时间。使用DoublingRation估计在你的计算机上用TwoSumFast、TwoSum、ThreeSumFast以及ThreeSum处理一个含有100万个整数的文件所需的时间。答:设N个数时运行时间为t,倍率为r,那么处理M个数时运行时间为: 1)TwoSumFast倍率实验: 阅读全文
posted @ 2018-10-26 09:37
修电脑的龙生
阅读(196)
评论(0)
推荐(0)
摘要:
1.4.40随机输入3-sum问题。猜测找出N个随机int值中和为0的整数三元组的数量所需时间并验证你的猜想。如果你擅长数学分析,请为此问题给出一个合适的数学模型,其中所有值均匀地分布在-M到M之间,且M不能是一个小整数。答:1)猜测找出N个随机int值的3sum数需要的时间为:T(N)=8.62* 阅读全文
posted @ 2018-10-26 09:35
修电脑的龙生
阅读(225)
评论(0)
推荐(0)
摘要:
1.4.39 改进倍率测试的精度。修改DoublingRation,使它接受另一个命令行参数来指定对于每个N值调用timeTrial()方法的次数。用程序对每个N执行10、100和1000遍实验并评估结果的准确程度。答:public class E1d4d39{ public static doub 阅读全文
posted @ 2018-10-26 09:33
修电脑的龙生
阅读(147)
评论(0)
推荐(0)
摘要:
1.4.38 3-sum的初级算法的实现。通过实验评估以下ThreeSum内循环的实现性能:for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<N;k++) if(i<j && j<k) if(a[i]+a[j]+a[k]==0) cnt+ 阅读全文
posted @ 2018-10-26 09:30
修电脑的龙生
阅读(244)
评论(0)
推荐(0)
摘要:
1.437自动装箱的性能代价。通过实验在你的计算机上计算使用自动装箱和自动拆箱所付出的性能代价。实现一个FixedCapacityStackOfInts,并使用类似DoublingRatio的用例比较它和泛型FixedCapacityStack<Integer>在进行大量push()和pop()操作 阅读全文
posted @ 2018-10-26 09:29
修电脑的龙生
阅读(197)
评论(0)
推荐(0)
摘要:
1.4.35下压栈的时间成本。解释下表中的数据,它显示了各种下压栈的实现的一般时间成本,其中成本模型会同时记录数据引用的数量(指向被压入栈之中的数据引用,指向的可能是数组,也可能是某个对象实例变量)和被创建的对象数量。1)基于链表的int元素类型,压入N个值的成本中,每个Node对象有一个item引 阅读全文
posted @ 2018-10-26 09:28
修电脑的龙生
阅读(304)
评论(0)
推荐(0)
摘要:
1.4.36下压栈的空间成本。解释下表中数据,它显示了各种下压栈的实现的一般空间成本,其中链表的节点为一个静态嵌套类,从而避免非静态嵌套类的开销。1)基于链表的int元素类型,N个值时需要N个Node,每个Node需要16字节的对象开销+两个8字节的引用,一共32字节,N个Node需要32N字节。2 阅读全文
posted @ 2018-10-26 09:28
修电脑的龙生
阅读(222)
评论(0)
推荐(0)
摘要:
1.4.34热还是冷。你的目标是猜出1到N之间的一个秘密的整数。每次猜完一个整数后,你会知道你的猜测和这个秘密整数是比较热(接近)还是比较冷(远离)。设计一个算法在~2lgN之内找到这个秘密整数,然后再设计一个算法在~1lgN之内找到这个秘密整数。答:解决2lgN中的不得不在每一次猜两个数就实现了l 阅读全文
posted @ 2018-10-26 09:26
修电脑的龙生
阅读(434)
评论(0)
推荐(0)
摘要:
1.4.34热还是冷。你的目标是猜出1到N之间的一个秘密的整数。每次猜完一个整数后,你会知道你的猜测和这个秘密整数是比较热(接近)还是比较冷(远离)。设计一个算法在~2lgN之内找到这个秘密整数,然后再设计一个算法在~1lgN之内找到这个秘密整数。答:1)猜12)猜N3)3.1)如果秘密数是1,猜中 阅读全文
posted @ 2018-10-26 09:25
修电脑的龙生
阅读(279)
评论(0)
推荐(0)
摘要:
1.4.33 32位计算机中的内存需求。给出32位计算机中Integer、Date、Counter、int[]、double[]、double[][]、String、Node和Stack(链表表示)对象所需的内存、设引用需要4字节,表示对象开销为8字节,所需内存均会被填充为4字节的倍数。答:Inte 阅读全文
posted @ 2018-10-26 09:24
修电脑的龙生
阅读(181)
评论(0)
推荐(0)
摘要:
1.4.32均摊分析。请证明,对一个基于大小可变的数组实现的空栈的M次操作访问数组的次数和M成正比。答:设N为2的幂 1)连续N次的push操作均摊后每次push操作访问数组的次数 设数组长度为L,一次延长需要的数组访问次数为:初始化2L长度的数组需要将数组元素置初值,需要2L次写操作。将原数组中L 阅读全文
posted @ 2018-10-26 09:22
修电脑的龙生
阅读(419)
评论(0)
推荐(0)
摘要:
1.4.30一个栈和一个steque实现的双向队列。使用一个栈和steque实现一个双向队列(请见练习1.3.32),使得双向队列的每个操作所需的栈和steque操作均摊后为一个常数。答:public class E1d4d30<Item>{ Stack<Item> s=new Stack<Item 阅读全文
posted @ 2018-10-26 09:21
修电脑的龙生
阅读(296)
评论(0)
推荐(0)
摘要:
1.4.31三个栈实现的双向队列。使用三个栈实现一个双向队列,使得双向队列的每个操作所需的栈操作均摊后为一个常数。答:public class E1d4d31<Item>{ Stack<Item> sLeft=new Stack<Item>(); Stack<Item> sRight=new Sta 阅读全文
posted @ 2018-10-26 09:21
修电脑的龙生
阅读(590)
评论(0)
推荐(0)
摘要:
1.4.29两个栈实现的steque。用两个栈实现一个steque(请见练习1.3.32),使得每个steque操作所需的栈操作均摊后为一个常数。答:public class E1d4d29<Item>{ Stack<Item> s1=new Stack<Item>(); Stack<Item> s 阅读全文
posted @ 2018-10-26 09:19
修电脑的龙生
阅读(240)
评论(0)
推荐(0)
摘要:
1.4.27两个栈实现队列。用两个栈实现一个队列,使得每个队列操作所需的堆栈操作均摊后为一个常数。提示:如果将所有元素压入栈再弹出,它们的顺序就被颠倒了。如果再次重复这个过程,它们的顺序则会复原。答:Algs4-1.3.4X栈与队列-两个栈实现一个队列均摊O(1) 阅读全文
posted @ 2018-10-26 09:18
修电脑的龙生
阅读(142)
评论(0)
推荐(0)
摘要:
1.4.28一个队列实现的栈。使用一个队列实现一个栈,使得每个栈操作所需的队列操作数量为线性级别。提示:要删除一个元素,将队列中的所有元素一一出列,除了最后一个元素,应该将它删除并返回(这种方法的确非常低效)。答:public class E1d4d28<Item>{ Queue<Item> q=n 阅读全文
posted @ 2018-10-26 09:18
修电脑的龙生
阅读(136)
评论(0)
推荐(0)
摘要:
1.4.26三点共线。假设有一个算法,接受平面上的N个点并能够返回在同一条直线上的三个点的组数。证明你能够用这个算法解决3-sum问题。强烈提示:使用代数证明当且仅当a+b+c=0时(a,a^3)、(b,b^3)和(c,c^3)在同一条直线上。 阅读全文
posted @ 2018-10-26 09:16
修电脑的龙生
阅读(364)
评论(0)
推荐(0)
摘要:
1.4.24扔鸡蛋。假设你面前有一栋N层的大楼和许多鸡蛋,假设将鸡蛋从F层或者更高的地方扔下鸡蛋才会摔碎,否则则不会。首先,设计一种策略来确定F的值,其中扔 ~logN次鸡蛋后摔碎的鸡蛋数量为~logN,然后想办法将成本降低到~2logF。答:public class E1d4d24{ public 阅读全文
posted @ 2018-10-26 09:15
修电脑的龙生
阅读(404)
评论(0)
推荐(0)
摘要:
1.4.25扔两个鸡蛋。和上一题相同的问题,但现在假设你只有两个鸡蛋,而你的成本模型则是扔鸡蛋的次数。设计一种策略,最多扔2sqrt(N)次鸡蛋即可判断出F的值,然后想办法把这个成本降低到~c.sqrt(F)次。这和查找命中(鸡蛋完好无损)比未命中(鸡蛋被摔碎)的成本小得多的情形类似。答:1)~2s 阅读全文
posted @ 2018-10-26 09:15
修电脑的龙生
阅读(415)
评论(0)
推荐(0)
摘要:
1.4.23分数的二分查找。设计一个算法,使用对数级别的比较次数找出有理数p/q,其中0<p<q<N,比较形式为给定的数是否小于x?提示:两个分母均小于N的有理数之间不小于1/N^2。 阅读全文
posted @ 2018-10-26 09:14
修电脑的龙生
阅读(338)
评论(0)
推荐(0)
摘要:
1.4.22仅用加减实现的二分查找(Mihai Patrascu)。编写一个程序,给定一个含有N个不同int值的按照升序排列的数组,判断它是否含有给定的整数。只能使用加法和减法以及常数的额外内存空间。程序运行时间在最坏情况下应该和logN成正比。答:用斐波纳契数代替2的幂(二分法)进行查找。用两个变 阅读全文
posted @ 2018-10-26 09:13
修电脑的龙生
阅读(455)
评论(2)
推荐(1)
摘要:
1.4.21无重复值之中的二分查找。用二分查找实现StaticSETofInts(请见表1.2.15),保证contains()的运行时间为~lgR,其中R为参数数组中不同整数的数量。答:感觉到不到点。import java.util.Arrays;public class E1d4d21{ pri 阅读全文
posted @ 2018-10-26 09:12
修电脑的龙生
阅读(222)
评论(0)
推荐(0)
摘要:
1.4.19矩阵的局部最小元素。给定一个含 有N^2个不同整数的NXN数组a[]。设计一个运行时间和N成正比的算法来找出一个局部最小元素:满足a[i][j]<a[i+1][j]、a[i][j]<a[i][j+1]、a[i][j]<a[i-1][j]以及a[i][j]<a[i][j-1]的索引i和j。 阅读全文
posted @ 2018-10-26 09:11
修电脑的龙生
阅读(682)
评论(0)
推荐(0)
摘要:
1.4.20双调查找。如果一个数组中的所有元素是先递增后递减的,则称这个数组为双调的。编写一个程序,给定一个含有N个不同int值的双调数组,判断它是否含有给定的整数。程序在最坏情况下所需的比较次数为~3lgN。答:第一步找出数组中的最大值索引,然后将数组从最大值索引位置一分为二,将数组分为单调递增和 阅读全文
posted @ 2018-10-26 09:11
修电脑的龙生
阅读(334)
评论(0)
推荐(0)
摘要:
1.4.18数组的局部最小元素。编写一个程序,给定一个含有N个不同整数的数组,找到一个局部最小元素:满足a[i]<a[i-1],且a[i]<a[i+1]的索引i。程序在最坏情况下所需的比较次数为~2lgN。答:检查数组的中间值a[N/2]以及和它相邻的元素a[N/2-1]和a[N/2+1]。如果a[ 阅读全文
posted @ 2018-10-26 09:10
修电脑的龙生
阅读(420)
评论(1)
推荐(0)
摘要:
1.4.17最遥远的一对(一维)。编写一个程序,给定一个含有N个double值的数组a[],在其中找到一对最遥远的值:两者之差(绝对值)最大的两个数。程序在最坏情况下所需的运行时间应该是线性级别的。答:import java.util.Arrays;public class TheFast{ pub 阅读全文
posted @ 2018-10-26 09:09
修电脑的龙生
阅读(233)
评论(1)
推荐(0)
摘要:
1.4.16最接近的一对(一维)。编写一个程序,给定一个含有N个double值的数组a[],在其中找到一对最接近的值:两者之差(绝对值)最小的两个数。程序在最坏情况下所需的运行时间应该是线性对数级别的。答:一个简单的实现,不 考虑多对最近点。import java.util.Arrays;publi 阅读全文
posted @ 2018-10-26 09:08
修电脑的龙生
阅读(346)
评论(0)
推荐(0)
摘要:
1.4.14 4-sum。为4-sum设计一个算法。答:import java.util.Arrays;public class FourSum{ public static int count1(int[] a) { int cnt=0; for(int i=0;i<a.length;i++) f 阅读全文
posted @ 2018-10-26 09:07
修电脑的龙生
阅读(265)
评论(0)
推荐(0)
摘要:
1.4.15快速3-sum。作为热身,使用一个线性级别的算法(而非基于二分查找的线性对数级别的算法)实现TwoSumFaster来计算已排序的数组中和为0的整数对的数量。用相同的思想为3-sum问题给出一个平方级别的算法。答:import java.util.Arrays;public class 阅读全文
posted @ 2018-10-26 09:07
修电脑的龙生
阅读(396)
评论(0)
推荐(0)
摘要:
1.4.13根据正文中的假设分别给出表示以下数据类型的一个对象所需的内存量:a.Accumulator对象开销:16字节total:8字节的double变量计数变量:4字节的int变量填充:4字节共计:32字节b.Transaction对象开销:16字节who:64+2*length(who)字节w 阅读全文
posted @ 2018-10-26 09:06
修电脑的龙生
阅读(284)
评论(0)
推荐(0)
摘要:
1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比。答:import java.util.Arrays;public class TheSameElement{ public static void main(Stri 阅读全文
posted @ 2018-10-26 09:05
修电脑的龙生
阅读(510)
评论(0)
推荐(0)
摘要:
1.4.11为StaticSETofInts添加一个实列方法howMany()(请见表1.2.15),找出给定键的出现次数且在最坏情况下所需的运行时间应该和logN成正比。答:import java.util.Arrays;public class StaticSETofInts{ private 阅读全文
posted @ 2018-10-26 09:04
修电脑的龙生
阅读(275)
评论(0)
推荐(0)
摘要:
1.4.9已知由倍率实验可得某个程序的时间倍率为2^b且问题规模为N0时程序的运行时间为T,给出一个公式预测试程序在处理规模为N的问题时所需的运行时间。答: (2b)N/N0*T0 1.4.9已知由倍率实验可得某个程序的时间倍率为2^b且问题规模为N0时程序的运行时间为T,给出一个公式预测试程序在处 阅读全文
posted @ 2018-10-26 09:03
修电脑的龙生
阅读(244)
评论(1)
推荐(0)
摘要:
1.4.10修改二分查找算法,使之总是返回和被查找的键匹配的索引最小元素(且仍然能够保证对数级别的运行时间)。答: 以下代码rankMin。import java.util.Arrays;public class BinarySearch{ public static int rank(int ke 阅读全文
posted @ 2018-10-26 09:03
修电脑的龙生
阅读(300)
评论(0)
推荐(0)
摘要:
1.4.7以统计涉及输入数字的算术操作( 和比较)的成本模型分析ThreeSum。 阅读全文
posted @ 2018-10-26 09:02
修电脑的龙生
阅读(367)
评论(0)
推荐(0)
摘要:
1.4.8编写一个程序,计算输入文件中相等的整数对的数量。如果你的第一个程序是平方级别的,请继续思考并用Array.sort()给出一个线性对数级别的解答。import java.util.Arrays;public class TwoSame{ //增长函数N2 public static int 阅读全文
posted @ 2018-10-26 09:02
修电脑的龙生
阅读(376)
评论(0)
推荐(0)
摘要:
1.4.6给出以下代码段的运行时间的增长数量级(作为N的函数):a.int sum=0; for (int n=N;n>0;n/=2) for(int i=0;i<n;i++) sum++;答: NlgNb.int sum=0; for (int i=1;i<N;i*=2; for(int j=0; 阅读全文
posted @ 2018-10-26 09:01
修电脑的龙生
阅读(661)
评论(1)
推荐(0)
摘要:
阅读全文
posted @ 2018-10-26 09:00
修电脑的龙生
阅读(342)
评论(0)
推荐(0)
摘要:
1.4.4参照表1.4.4为TwoSum建立一和类似的表格。 阅读全文
posted @ 2018-10-26 08:58
修电脑的龙生
阅读(316)
评论(0)
推荐(0)
摘要:
1.4.2修改ThreeSum,正确处理两个较大的int值相加可能溢出的情况。答:public class ThreeSum{ public static int count(int[] a) { int N=a.length; int cnt=0; long arg1; long arg2; lo 阅读全文
posted @ 2018-10-26 08:57
修电脑的龙生
阅读(808)
评论(1)
推荐(0)
摘要:
1.4.3修改DoublingTest,使用StdDraw产生类似于正文中标准图像和对数图像,概据需要调整比例使图像总能够充满窗口的大部分区域。public class DoublingTest{ public static double timeTrial(int N) { int MAX=100 阅读全文
posted @ 2018-10-26 08:57
修电脑的龙生
阅读(330)
评论(0)
推荐(0)
摘要:
1.4.1证明从N个数中取三个整数的不同组合的总数为N(N-1)(N-2)/6。提示:使用数学归纳法。答:基础步骤:N>=3时才有可能有三个整数的组合,将N=3代入上式得3*2*1/6=1,而N=3时有且只有一个三整数组合,基础步骤成立。归纳步骤:当N=k时不同的组合个数为C(k,3)= k(k-1 阅读全文
posted @ 2018-10-26 08:56
修电脑的龙生
阅读(1076)
评论(0)
推荐(0)
摘要:
public class DoublingRatio{ public static double timeTrial(int N) { int MAX=1000000; int[] a=new int[N]; for(int i=0;i<N;i++) a[i]=StdRandom.uniform(- 阅读全文
posted @ 2018-10-26 08:54
修电脑的龙生
阅读(137)
评论(0)
推荐(0)
摘要:
import java.util.Arrays;public class TwoSumFast{ public static int count(int[] a) { Arrays.sort(a); int N=a.length; int cnt=0; for(int i=0;i<N;i++) if 阅读全文
posted @ 2018-10-26 08:53
修电脑的龙生
阅读(157)
评论(0)
推荐(0)
摘要:
import java.util.Arrays;public class ThreeSumFast{ public static int count(int[] a) { Arrays.sort(a); int N=a.length; int cnt=0; for(int i=0;i<N;i++) 阅读全文
posted @ 2018-10-26 08:53
修电脑的龙生
阅读(122)
评论(0)
推荐(0)
摘要:
public class ThreeSum{ public static int count(int[] a) { int N=a.length; int cnt=0; for (int i=0;i<N;i++) for (int j=i+1;j<N;j++) for(int k=j+1;k<N;k 阅读全文
posted @ 2018-10-26 08:52
修电脑的龙生
阅读(95)
评论(0)
推荐(0)
摘要:
public class TwoSum{ public static int count(int[] a) { int N=a.length; int cnt=0; for (int i=0;i<N;i++) for (int j=i+1;j<N;j++) if(a[i]+a[j]==0) cnt+ 阅读全文
posted @ 2018-10-26 08:52
修电脑的龙生
阅读(96)
评论(0)
推荐(0)
摘要:
1.3.50快速出错的迭代器。修改Stack的迭代器代码,确保一旦用例在迭代器中(通过push()或pop()操作)修改集合数据就抛出一个java.util.ConcurrentModificationException异常。解答:用一个计数器记录push()和pop()操作的次数。在创建迭代器时, 阅读全文
posted @ 2018-10-26 08:51
修电脑的龙生
阅读(321)
评论(0)
推荐(0)
摘要:
早期版本题目:1.3.49 Queue with three stacks. Implement a queue with three stacks so that each queue operation takes a constant (worst-case) number of stack 阅读全文
posted @ 2018-10-26 08:50
修电脑的龙生
阅读(277)
评论(2)
推荐(0)
摘要:
public class QueueWithTwoStack<Item>{ Stack<Item> s1=new Stack<Item>(); Stack<Item> s2=new Stack<Item>(); public boolean isEmpty() { return s1.isEmpty 阅读全文
posted @ 2018-10-26 08:49
修电脑的龙生
阅读(200)
评论(0)
推荐(0)
摘要:
1.3.47可连接的队列、栈或steque。为队列、栈或steque(请见练习1.3.32)添加一个能够(破坏性地)连接两个同类对象的额外操作catenation。答:Queue 代码:import java.util.Iterator;public class Queue<Item> implem 阅读全文
posted @ 2018-10-26 08:47
修电脑的龙生
阅读(270)
评论(0)
推荐(0)
摘要:
1.3.48双向队列与栈。用一个双向队列实现两个栈,保证每个栈操作只需要常数次的双向队列操作(请见练习1.3.33)。答:public class StackDouble<Item>{ private Deque<Item> q=new Deque<Item>(); ///////////Stack 阅读全文
posted @ 2018-10-26 08:47
修电脑的龙生
阅读(209)
评论(0)
推荐(0)
摘要:
1.3.46栈可生成性问题中禁止出现的排列。若三元组 (a,b,c)中a<b<c且c最先被弹出,a第二,b第三(c和a以及a和b之间可以间隔其他整数),那么当且仅当排列中不含这样的三元组时(如上题所述的)栈才可能生成它。部分解答:设有一个这样的三元组(a,b,c)。c会在a和b之前被弹出,但a和b会 阅读全文
posted @ 2018-10-26 08:46
修电脑的龙生
阅读(321)
评论(0)
推荐(0)
摘要:
1.3.45栈的可生成性。假设我们的栈测试用例将会进行一系列混合的入栈和出栈操作,序列中的整数0,1,...,N-1(按此先后顺序排列)表示入栈操作,N个减号表示出栈操作。设计一个算法,判定给定的混合序列是否会使数组向下溢出(你所使用的空间量与N 无关,即不能用某种数据结构存储所有整数)。设计一个线 阅读全文
posted @ 2018-10-26 08:45
修电脑的龙生
阅读(418)
评论(0)
推荐(0)
摘要:
1.3.43文件列表。文件夹就是一列文件和文件夹的列表。编写一个程序,从命令行接受一个文件夹名作为参数,打印出访文件夹下的所有文件并用递归的方式在所有子文件夹的名下(缩进)列出其下的所有文件。提示:使用队列,并参考java.io.File。答:import java.io.File;public c 阅读全文
posted @ 2018-10-26 08:44
修电脑的龙生
阅读(235)
评论(0)
推荐(0)
摘要:
1.3.44文本编辑器的缓冲区。为文本编辑器的缓冲区设计一种数据类型并实现表1.3.13中的API.表1.3.13文本缓冲区的API:public class Buffer Buffer//创建一块空缓冲区 void insert(char c)//光标位置插入字符c char delete()// 阅读全文
posted @ 2018-10-26 08:44
修电脑的龙生
阅读(352)
评论(0)
推荐(0)
摘要:
1.3.42复制栈。为基于链表产现的栈编写一个新的构造函数,使以下代码Stack<Item> t=new Stack<Item>(s);得到的t指向栈s的一个新的独立的副本。答:import java.util.Iterator;public class Stack<Item> implements 阅读全文
posted @ 2018-10-26 08:43
修电脑的龙生
阅读(253)
评论(0)
推荐(0)
摘要:
1.3.41复制队列。编写一个新的构造函数,使用以下代码Queue<Item> r=new Queue<Item>(q);得到的r指向队列q的一个新的独立的副本。可以对q或r进行任意入列或出列操作但它们不会相互影响。提示:从q中取出所有元素再将它们插入q和r。答: import java.util. 阅读全文
posted @ 2018-10-26 08:42
修电脑的龙生
阅读(186)
评论(0)
推荐(0)
摘要:
1.3.39环形缓冲区。环形缓冲区,又称环形队列,是一种定长为N的先进先出的数据结构。它在进程间的异步数据传输或记录日志文件时十分有用。当缓冲区为空时,消费者会在数据存入缓冲区前等待;当缓冲区满时,生产者会等待将数据存入缓冲区。为RingBuffer设计一份API并用(回环)数组将其实现。答:imp 阅读全文
posted @ 2018-10-26 08:41
修电脑的龙生
阅读(302)
评论(0)
推荐(0)
摘要:
1.3.40前移编码。从标准输入读取一串字符,使用链表保存这些字符并清除重复字符。当你读取了一个从未见过的字符时,将它插入表头。当你读取了一个重复的字符时,将它从链表中删除并再次插入表头。将你的程序命名为MoveToFront:它实现了著名的前移编码策略,这种策略假设最近访问过的元素很有可能再次访问 阅读全文
posted @ 2018-10-26 08:41
修电脑的龙生
阅读(321)
评论(0)
推荐(0)
摘要:
1.3.38删除第k个元素。实现一个类并支持表1.3.12中的API:表1.3.12泛型一般队列的APIpublic class GeneralizedQueue<Item> GeneralizedQueue()//创建一条空队列 boolean isEmpty()//队列是否为空 void ins 阅读全文
posted @ 2018-10-26 08:40
修电脑的龙生
阅读(196)
评论(0)
推荐(0)
摘要:
1.3.38删除第k个元素。实现一个类并支持表1.3.12中的API:表1.3.12泛型一般队列的APIpublic class GeneralizedQueue<Item> GeneralizedQueue()//创建一条空队列 boolean isEmpty()//队列是否为空 void ins 阅读全文
posted @ 2018-10-26 08:40
修电脑的龙生
阅读(206)
评论(0)
推荐(0)
摘要:
1.3.36随机迭代器。为上一题中的RandomQueue<Item>编写一个迭代器,随机返回队列中的所有元素。答:import java.util.Iterator;public class RandomQueue<Item> implements Iterable<Item>{ private 阅读全文
posted @ 2018-10-26 08:39
修电脑的龙生
阅读(168)
评论(0)
推荐(0)
摘要:
1.3.37Josephus问题。在这个古老的问题中,N个身陷绝境的人一致同意通过以下方式减少生存人数。他们围坐成一圈(位置记为0到N-1)并从第一个人开始报数,报到M的人会被杀死,直到最后一个人留下来。传说中Josephus找到了不会被杀死的位置。编写一个Queue的用例Josephus,从命令行 阅读全文
posted @ 2018-10-26 08:39
修电脑的龙生
阅读(183)
评论(0)
推荐(0)
摘要:
1.3.35随机队列。随机队列能够存储一组元素并支持表1.3.11中的API:表1.3.11泛型随机队列的APIpublic class RandomQueue<Item> RandomQueue()//创建一条空的随机队列 boolean isEmpty()//队列是否为空 void enqueu 阅读全文
posted @ 2018-10-26 08:38
修电脑的龙生
阅读(261)
评论(0)
推荐(0)
摘要:
1.3.33Deque。一个双向队列(或者称为deque)和栈或队列类似,但它同时支持在两端添加或删除元素。Deque能够存储一组元素并支持表1.3.9中的API:表1.3.9泛型双向队列的APIpublic class Deque<Item> implements Iterable<Item> D 阅读全文
posted @ 2018-10-26 08:37
修电脑的龙生
阅读(278)
评论(0)
推荐(0)
摘要:
1.3.34随机背包。随机背包能够存储一组元素并支持表1.3.10中的API:表1.3.10泛型随机背包的APIpublic class RandomBag<Item> implements Iterable<Item> RandomBag()//创建一个空随机背包 boolean isEmpty( 阅读全文
posted @ 2018-10-26 08:37
修电脑的龙生
阅读(264)
评论(0)
推荐(0)
摘要:
1.3.33Deque。一个双向队列(或者称为deque)和栈或队列类似,但它同时支持在两端添加或删除元素。Deque能够存储一组元素并支持表1.3.9中的API:表1.3.9泛型双向队列的APIpublic class Deque<Item> implements Iterable<Item> D 阅读全文
posted @ 2018-10-26 08:36
修电脑的龙生
阅读(399)
评论(0)
推荐(0)
摘要:
1.3.32Steque。一个以栈为目标的队列(或称为steque),是一种支持push、pop、和enqueue操作的数据类型。为这种抽象数据类型定义一份API并给出一份基于链表的实现。import java.util.Iterator;public class Steque<Item> impl 阅读全文
posted @ 2018-10-26 08:35
修电脑的龙生
阅读(357)
评论(0)
推荐(0)

浙公网安备 33010602011771号