联合查找算法Union Find的一些分析
2014-08-19 12:01
113 查看
最近在学习Robert Sedgewic,Kevin Wayne的Algorithms第四版,谈谈有关并查集的概念。
首先,我们知道并查集是一种树型的数据结构,用于处理一些不相交集合,而最重要的就是联合查找算法,Union Find。
并查集的基本操作:
makeSet(s):建立一个新的并查集,其中包含 s 个单元素集合。
unionSet(x, y):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并。
find(x):找到元素 x 所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了。
列出Union Find的API:
动态连接 的基本操作:
然后,我们可以列出快速查找的算法:
快速联合算法:
首先,我们知道并查集是一种树型的数据结构,用于处理一些不相交集合,而最重要的就是联合查找算法,Union Find。
并查集的基本操作:
makeSet(s):建立一个新的并查集,其中包含 s 个单元素集合。
unionSet(x, y):把元素 x 和元素 y 所在的集合合并,要求 x 和 y 所在的集合不相交,如果相交则不合并。
find(x):找到元素 x 所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了。
列出Union Find的API:
动态连接 的基本操作:
public static void main(String[] args) { int N = StdIn.readInt(); UF uf = new UF(N); while (!StdIn.isEmpty()) { int p = StdIn.readInt(); int q = StdIn.readInt(); if (!uf.connected(p, q)) { uf.union(p, q); StdOut.println(p + " " + q); } } }输出:
10 4 3 3 8 6 5 9 4 2 1 8 9 5 0 7 2 6 1 1 0 6 7
然后,我们可以列出快速查找的算法:
public class QuickFindUF { private int[] id; public QuickFindUF(int N) { id = new int ; for (int i = 0; i < N; i++) id[i] = i; } public boolean connected(int p, int q) { return id[p] == id[q]; } public void union(int p, int q) { int pid = id[p]; int qid = id[q]; for (int i = 0; i < id.length; i++) if (id[i] == pid) id[i] = qid; } }
快速联合算法:
public class QuickUnionUF { private int[] id; public QuickUnionUF(int N) { id = new int ; for (int i = 0; i < N; i++) id[i] = i; } private int root(int i) { while (i != id[i]) i = id[i]; return i; } public boolean connected(int p, int q) { return root(p) == root(q); } public void union(int p, int q) { int i = root(p); int j = root(q); id[i] = j; } }
相关文章推荐
- dottext中HttpHandler的一些分析
- duwamish7的一些代码分析总结
- 一個抄來的關于如何讀取網絡上一些網頁內容以及相應處理的方法 , 近日在分析這方面的技術點, 以下這一小部分, 作為一個sample代碼先留下
- 防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
- 让我们摒弃一些浮躁 -- 对Norton误报WinXP事件的技术分析
- 防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
- 让我们摒弃一些浮躁 -- 对Norton误报WinXP事件的技术分析[转]
- 算法分析涉及到的一些函数图像
- 今天看了ACE 中Proactor实现部分的一些代码,做一些总结和分析
- 分析数据库的一些方法
- 对需求分析的一些理解
- outpost firewall 的一些技术分析
- 一些Liferay小问题的分析
- 对内联函数与普通函数的一些比较与分析:
- 【分析】RPC文件名长度堆溢出分析及其通用性堆溢出攻击的一些发现
- JfreeChart使用经验总结(分析了使用中碰到的一些常见问题)
- C语言一些特性的分析
- 对于做需求分析时的一些心得
- 关于递归的一些分析
- 一些TCPDUMP语义分析(长期补充)