摘要:
1.5.22Erods-renyi模型的倍率实验。开发一个性能测试用例 ,从命令行接受一个int值T并进行T次以下实验:使用练习1.5.17的用例生成随机连接,和我们的开发用例一样使用UnionFind来检查触点的连通性,不断循环直到所有触点均相互连通。对于每个N,0打印出N值和平均所需的连接数以及 阅读全文
摘要:
1.5.23在Erdos-Renyi模型下比较quick-find算法和quick-union算法。开发一个性能测试用例,从命令行接受一个int值T并进行T次以下实验:使用练习1.5.17的用例生成随机连接。保存这些连接并和我们的开发用例一样分别用quikc-find算法和quick-union算法 阅读全文
摘要:
1.5.20动态生长。使用链表或大小可变的数组实现加权quick-union算法,去掉需要预先知道对象数量的限制。为API添加一个新方法netwSite(),它应该返回一个类型为int的标识符。答:1)第一对p,q加入时,新增两个节点,设置p为q的父节点。2)第一对之后的每一对p,q加入时,需要先判 阅读全文
摘要:
1.5.21Erdos-renyi模型。使用练习1.5.17的用例验证这个猜想:得到单个连通分量所需生成的整数对数量为~1/2NlnN。public class E1d5d21{ public static void main(String[] args) { int T=Integer.parse 阅读全文
摘要:
1.5.20动态生长。使用链表或大小可变的数组实现加权quick-union算法,去掉需要预先知道对象数量的限制。为API添加一个新方法netwSite(),它应该返回一个类型为int的标识符。public class WeightedQuickUnionUFofDynamicWithArray{ 阅读全文
摘要:
1.5.19动画。编写一个RandomGrid(请见练习1.5.18)的用例,和我们开发用例一样使用UnionFind来检查触点的连通性并在处理的同时用StdDraw将它们绘出。答:书上的连通性太美,这里太挫了。 public class RandomGridAnimation{ public st 阅读全文
摘要:
1.5.18随机网格生成器。编写一个程序RandomGrid,从命令行接受一个int值N,生成一个NXN的网格中的所有连接。它们的排列随机且方向随机(即(p q)和(q p)出现的可能性是相等的),将这个结果打印到标准输出中。可以使用RandomBag将所有连接随机排列(请见练习1.3.34),并使 阅读全文
摘要:
1)QuickFindUF(1000点)2)QuickUnionUF(1000点)3)WeightedQuickFindUF(2000点)4)WeightedQuickUnionUF(1000点)CODE:public class QuickFindUF{ private int[] id; pri 阅读全文
摘要:
1.5.17随机连接。设计UF的一个用例 ErdosRenyi,从命令行接受一个整数N,在0到N-1之间产生随机整数对,调用connected()判断它们是否相连,如果不是则调用union()方法(和我们的开发用例一样)。不断循环直到所有触点均相互连通并打印出生成的连接总数。将你的程序打包成一个接受 阅读全文
摘要:
1.5.15二项树。请证明,对于加权quick-union算法,在最坏情况下树中每一层的节点数均为二项式系数。在这种情况下,计算含有N=2^n个节点的树中节点的平均深度。答:1)最坏情况是指在指定的节点数目下构建最大深度的树,要构建最大深度的树就需要在树的每次合并都会使合并后的树高度增加,要使两棵树 阅读全文
摘要:
1.5.14根据高度加权的quick-union算法。给出UF的一个实现,使用和加权quick-union算法相同的策略,但记录的是树的高度并不总是将较矮的树连接到较高的树上 。用算法证明N个触点的树的高度不会超过其大小的对数级别。答:暂未证明。public class E1d5d14{ priva 阅读全文
摘要:
1.5.12使用路径压缩的quick-union算法。根据路径压缩修改quick-union算法(请见1.5.2.3节),在find()方法中添加一个循环来将从p到根节点的路径上的每个触点都连接到根节点。给出一列输入,使该方法能够产生一条长度为4的路径。注意:该算法的所有操作的均摊成本已知为对数级别 阅读全文
摘要:
1.5.13使用路径压缩的加权quick-union算法。修改加权quick-union算法(算法1.5),实现如练习1.5.12所述的路径压缩。给出一列输入,使该方法能够产生一棵高度为4的树。注意:访算法的所有操作的均摊成本已知被限制在反Ackermann函数的范围之内,且对于实际应用中可能出现的 阅读全文
摘要:
1.5.11实现加权quick-find算法,其中我们总是将较小的分量重命名为较大的分量的标识符。这种改变会对性能产生怎样的影响?答:每次union需要多访问N次id数组进行判断,同时还需要对两个分量的触点个数的sz赋新值,也会增加数组的访问,性能将会降低。public class E1d5d11{ 阅读全文
摘要:
1.5.10在加权quick-union算法中,假设我们将id[find(p)]的值设为q而非id[find(q)],所得的算法是正确的吗? 答:是,但这会增加树的高度,因此无法保证同样的性能。 阅读全文
摘要:
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 阅读全文
摘要:
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得到的树最大深度 阅读全文
摘要:
1.5.7分别为quick-find算法和quick-union算法实现QuickFindUF类和QuickUnionUF类。 public class QuickFindUF { private int[] id; private int count; public QuickFindUF(int 阅读全文
摘要:
1.5.6使用加权quick-union算法完成练习1.5.5。 1.5.6使用加权quick-union算法完成练习1.5.5。 1.5.6使用加权quick-union算法完成练习1.5.5。 阅读全文
摘要:
1.5.5在一台每秒能够处理10^9条指令的计算机上,估计quick-find算法解决含有10^9个触点和10^6条连接的动态连通性问题所需的最短时间内循环for的每一次迭代需要执行10条机器指令。 阅读全文