1.3:Union-Find算法-----quick-union算法
2016-03-15 20:42
176 查看
1:quick-find算法的不足
当我们利用quick-find来解决动态联通性的问题时,至少要调用N-1次union()。而一次union()算法至少需要访问数组N+3次。所以我们访问数组的总次数为(N-1)(N+3)次,为平方级别。用来解决大型问题绝对不可能。因此,考虑对union()算法的优化。2:quick-union算法的数据结构
quick-union算法的数据结构与quick-find算法的数据结构相差无几。都是以id[]数组作为索引。不过不同的是quick-union算法中的每个触点对应的id[]元素都是同一个分量中另一个触点的名称。这种联系叫“链接”。就像一个个指针,指向另一个元素。这种结构有点类似树。3:quick-union算法的基本思想及代码实现
基于此,union算法就非常简单了。对于union(p,q),只要沿着各自的链接,找到他们的根触点,然后将其中一个的根触点链接到另外一个即可将两个分量合并成一个分量。而对于find()算法只需要不断沿着id[]索引的方向查找即可。代码如下
public class QuickUnionUF { private int[] id; private int count; //分量数量 public QuickUnionUF(int N) { count = N; id = new int ; for(int i = 0; i < N; i++) id[i] = i; } public int count() { return count; } public boolean connected(int p, int q) { return find(p) == find(q); } public int find(int p) { //找到节点p的根节点 while(id[p] != p) p = id[p]; return p; } public void union(int p, int q) { int pRoot = find(p); int qRoot = find(q); if(pRoot == qRoot) return ; id[pRoot] = qRoot; count--; } }
相关文章推荐
- IOS学习之UIPanGestureRecognizer使用
- Codeforces 623E Transforming Sequence (分治+FFT)
- UITableViewCell使用小结
- iOS常见错误9-UITableView,UIScrollView,UICollectionView偏移20像素
- android.os.Build
- UIImagePickerController
- Java goto,continue,break,标签
- Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学
- 06 GPUImage滤镜效果
- 建造者模式(Builder Pattern)
- iOS UI 的坑:不要 remove UITableViewCell 的 contentView
- A4988 步进电机加速控制算法的尝试(上)――arduino实现篇
- UID 是否有对应用户名
- 03 GPUImage为图片添加滤镜
- 简述UIViewControl之间的七种传值方式
- STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map
- BZOJ1570Blue Mary的旅行
- 19.leetcode题目303: Range Sum Query - Immutable
- HDU Buildings
- ACM程序设计选修课——1018: Common Subsequence