06--图解数据结构之并查集

mac2022-06-30  140

连接问题--网络中节点间的连接状态 节点、边--isConnrcted(p,q) 集合的并集---union(p,q)

并查询连接.png

并查集接口

/** * 作者:张风捷特烈 * 时间:2018/9/25 0025:11:09 * 邮箱:1981462002@qq.com * 说明:并查集接口 */ public interface IUF { /** * 查看p,q元素是否属于同一集合 * * @param p p元素 * @param q q元素 * @return 是否属于同一集合 */ boolean isConnected(int p,int q); /** * 联合p,q所在集合 * @param p p元素 * @param q q元素 */ void unionEl(int p, int q); /** * 元素个数 * @return 元素个数 */ int size(); }

第一版:快速查询的并查集

/** * 作者:张风捷特烈 * 时间:2018/9/25 0025:11:15 * 邮箱:1981462002@qq.com * 说明:快速查询并查集 */ public class QuickFindUF implements IUF { private int[] id; public QuickFindUF(int size) { id = new int[size]; for (int i = 0; i < id.length; i++) { id[i] = i; } } @Override public boolean isConnected(int p, int q) { return find(p) == find(q); } @Override public void unionEl(int p, int q) { int pID = find(p); int qID = find(q); if (pID == qID) { return; } for (int i = 0; i < id.length; i++) { if (id[i] == pID) { id[i] = qID; } } } /** * 查找元素p所对应的集合编号 * * @param p 元素 * @return p所对应的集合编号 */ private int find(int p) { if (p < 0 || p >= id.length) { throw new IllegalArgumentException("p is out of bound."); } return id[p]; } @Override public int size() { return id.length; } }

isConnected方法复杂度O(1) unionEl方法复杂度O(n)


第二版:快速合并并查集

/** * 作者:张风捷特烈 * 时间:2018/9/25 0025:11:15 * 邮箱:1981462002@qq.com * 说明:快速合并并查集 */ public class QuickUnionUF implements IUF { private int[] parent; public QuickUnionUF(int size) { parent = new int[size]; //每个节点都是一颗树 for (int i = 0; i < parent.length; i++) { parent[i] = i; } } @Override public boolean isConnected(int p, int q) { return find(p) == find(q); } @Override public void unionEl(int p, int q) { int pRoot = find(p); int qRoot = find(q); if (pRoot == qRoot) { return; } parent[pRoot] = qRoot; } /** * 查找元素p所对应的集合编号 * * @param p 元素 * @return p所对应的集合编号 */ private int find(int p) { if (p < 0 || p >= parent.length) { throw new IllegalArgumentException("p is out of bound."); } while (p != parent[p]) { p = parent[p]; } return p; } @Override public int size() { return parent.length; } }

基于树实现,isConnected和unionEl的复杂度O(logn),但有可能退化到O(n)


第三版:改良型----基于集合节点数连接

/** * 作者:张风捷特烈 * 时间:2018/9/25 0025:11:15 * 邮箱:1981462002@qq.com * 说明:快速合并并查集优化 */ public class QuickUnion2UF implements IUF { private int[] parent; /** * 以treeSize[i]为根的集合元素个数 */ private int[] treeSize; public QuickUnion2UF(int size) { parent = new int[size]; treeSize = new int[size]; //每个节点都是一颗树 for (int i = 0; i < parent.length; i++) { parent[i] = i; treeSize[i] = 1; } } @Override public boolean isConnected(int p, int q) { return find(p) == find(q); } @Override public void unionEl(int p, int q) { int pRoot = find(p); int qRoot = find(q); if (pRoot == qRoot) { return; } if (treeSize[pRoot] < treeSize[qRoot]) { parent[pRoot] = qRoot; treeSize[qRoot] += treeSize[pRoot]; } else { parent[qRoot] = pRoot; treeSize[pRoot] += treeSize[qRoot]; } } /** * 查找元素p所对应的集合编号 * * @param p 元素 * @return p所对应的集合编号 */ private int find(int p) { if (p < 0 || p >= parent.length) { throw new IllegalArgumentException("p is out of bound."); } while (p != parent[p]) { p = parent[p]; } return p; } @Override public int size() { return parent.length; } }

第三版:改良型----基于集合树深数连接

/** * 作者:张风捷特烈 * 时间:2018/9/25 0025:11:15 * 邮箱:1981462002@qq.com * 说明:快速合并并查集优化 */ public class QuickUnion3UF implements IUF { private int[] parent; /** * 以rank[i]为根的集合元素个数 */ private int[] rank; public QuickUnion3UF(int size) { parent = new int[size]; rank = new int[size]; //每个节点都是一颗树 for (int i = 0; i < parent.length; i++) { parent[i] = i; rank[i] = 1; } } @Override public boolean isConnected(int p, int q) { return find(p) == find(q); } @Override public void unionEl(int p, int q) { int pRoot = find(p); int qRoot = find(q); if (pRoot == qRoot) { return; } //按照深度来连接 if (rank[pRoot] < rank[qRoot]) { parent[pRoot] = qRoot; } else if (rank[qRoot] < rank[pRoot]) { parent[qRoot] = pRoot; } else { parent[qRoot] = pRoot; rank[pRoot] += 1; } } /** * 查找元素p所对应的集合编号 * * @param p 元素 * @return p所对应的集合编号 */ private int find(int p) { if (p < 0 || p >= parent.length) { throw new IllegalArgumentException("p is out of bound."); } while (p != parent[p]) { p = parent[p]; } return p; } @Override public int size() { return parent.length; } }

时间分析:

unionEl方法册数测试:size=10000
方法\数量复杂度10001000010W100W1000WQuickFindUFO(n)0.0197秒0.0880秒0.1199秒0.1688秒0.5216秒QuickUnionUFO(logn)0.0015秒0.0132秒0.7418秒7.0839秒----秒quickUnion2UFO(logn)0.0017秒0.0050秒0.0220秒0.0966秒0.6657秒
unionEl方法册数测试:size=100000
方法\数量复杂度10001000010W100W1000WQuickFindUFO(n)0.0197秒0.0880秒0.1199秒0.1688秒10.0468秒QuickUnionUFO(logn)0.0015秒0.0132秒0.7418秒7.0839秒----秒quickUnion2UFO(logn)0.0017秒0.0050秒0.0220秒0.0966秒0.8478秒
unionEl方法册数测试:size=1000000
方法\数量复杂度10001000010W100W1000WQuickFindUFO(n)0.6346秒5.3409秒----秒----秒----秒QuickUnionUFO(logn)0.0012秒0.0052秒0.0281秒----秒----秒quickUnion2UFO(logn)0.0013秒0.0062秒0.0304秒0.2186秒1.8915秒
unionEl方法册数测试:size=10000000
方法\数量复杂度10001000010W100W1000WquickUnion2UFO(logn)0.0013秒0.0063秒0.0335秒0.1903秒2.5726秒quickUnion3UFO(logn)0.0016秒0.0060秒0.0323秒0.1932秒2.5327秒

后记、

1.声明:

[1]本文由张风捷特烈原创,各图均由本人亲自所画,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多数据结构知识欢迎访问:图解数据结构 项目源码均在我的https://github.com/toly1994328/DS:欢迎star 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002 邮箱:1981462002@qq.com 微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg

转载于:https://www.cnblogs.com/toly-top/p/9781865.html

最新回复(0)