项目场景:
手写一下并查集这个数据结构
问题描述:
这里先空着,等有时间在过来完善一下并查集的概念。
代码实现:
这里直接给出了并查集的Java版本写法:
package newcode.zuochengyun.easyday05;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UnionFindSet {
private List<Node> nodeList;
class Node {
public int value;
}
private Map<Node, Node> fatherMap;
private Map<Node, Integer> sizeMap;
public UnionFindSet(List<Node> nodeList) {
makeSet(nodeList);
}
private void makeSet(List<Node> nodeList) {
fatherMap = new HashMap<Node, Node>();
sizeMap = new HashMap<Node, Integer>();
for (Node node : nodeList) {
fatherMap.put(node, node);
sizeMap.put(node, 1);
}
}
public Node findHead(Node node) {
Node father = fatherMap.get(node);
if (father != node) {
father = findHead(node);
}
fatherMap.put(node, father);
return father;
}
public boolean isSameSet(Node node1, Node node2) {
return findHead(node1) == findHead(node2);
}
public void union(Node node1, Node node2) {
if (node1 == null || node2 == null) return;
int node1Size = sizeMap.get(node1);
int node2Size = sizeMap.get(node2);
Node node1Father = fatherMap.get(node1);
Node node2Father = fatherMap.get(node2);
if (node1Father == node2Father) return;
if (node1Size < node2Size) {
fatherMap.put(node1Father, node1Father);
sizeMap.put(node1Father, node1Size + node2Size);
} else {
fatherMap.put(node2Father, node1Father);
sizeMap.put(node2Father, node1Size + node2Size);
}
}
}