摘要:
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的路径。注意:该算法的所有操作的均摊成本已知为对数级别 阅读全文