判断在一个网络中,两个点是否连通
-
数学建模
- 如何表示整个网络中的点?
- 如何表示两个点连通?
- 如何将给定的点连通?
-
数据结构选取
- 用树表示整个网络
- 两个点的根节点相同则为连通
- 将两个点的根节点改为一样则表示将两点连通
-
代码实现
-
package com.jd.testjava.algorithm; /** * 连通性问题 * 使用树结构实现 * 弊端:可能生成很高的树,影响查询效率 * * @author lichenyang8 * @date 2019/3/25 */ public class QuickUnionAlgorithm implements IAlgorithm{ private int[] ids; private final int length; /** * 初始化数组 * @param length */ public QuickUnionAlgorithm(int length){ this.length = length; ids = new int[length]; for (int i = 0; i < length; i++) { ids[i] = i; } } /** * 查询根节点 * 自己的根节点等于自身,则为根节点 */ private int getRoot(int p){ while (ids[p] != p){ p = ids[p]; } return p; } /** * 查询是否联通 * 根节点相同则为联通 */ @Override public Boolean isConnect(int p, int q){ return getRoot(p) == getRoot(q); } /** * 连通两个节点 * @param p * @param q */ @Override public void connect(int p, int q){ int pid = ids[p]; int qid = ids[q]; ids[pid] = qid; } }
问题描述:如果大树合并在小数下,则树得高度会成倍增长,在 查询时会一步一步得查找根节点,影响查询性能。
-
应改为: 带权(树高)快速合并算法