zoukankan      html  css  js  c++  java
  • 算法-并查集-1

     1 public class Element<V> {
     2     public V value;
     3 
     4     public Element(V value) {
     5         this.value = value;
     6     }
     7 
     8     public static class UnionFindSet<V> {
     9         public Map<V, Element<V>> elementMap;
    10         public Map<Element<V>, Element<V>> fatherMap;
    11         public Map<Element<V>, Integer> sizeMap;
    12 
    13         public UnionFindSet(List<V> list) {
    14             elementMap = new HashMap<>();
    15             fatherMap = new HashMap<>();
    16             sizeMap = new HashMap<>();
    17             if (list != null && !list.isEmpty()) {
    18                 for (V v : list) {
    19                     Element<V> vElement = new Element<>(v);
    20                     elementMap.put(v, vElement);
    21                     fatherMap.put(vElement, vElement);
    22                     sizeMap.put(vElement, 1);
    23                 }
    24             }
    25         }
    26 
    27         public Element<V> findHead(Element<V> element) {
    28             Stack<Element<V>> stack = new Stack<>();
    29             while (fatherMap.get(element) != element) {
    30                 stack.push(element);
    31                 element = fatherMap.get(element);
    32             }
    33             while (!stack.isEmpty()) {
    34                 fatherMap.put(stack.pop(), element);
    35             }
    36             return element;
    37         }
    38 
    39         public boolean isSameSet(V a, V b) {
    40             if (elementMap.containsKey(a) && elementMap.containsKey(b)) {
    41                 Element<V> aHead = findHead(elementMap.get(a));
    42                 Element<V> bHead = findHead(elementMap.get(b));
    43                 if (aHead == bHead) {
    44                     return true;
    45                 }
    46             }
    47             return false;
    48 
    49         }
    50 
    51         public void union(V a, V b) {
    52             if (elementMap.containsKey(a) && elementMap.containsKey(b)) {
    53                 Element<V> aElement = elementMap.get(a);
    54                 Element<V> bElement = elementMap.get(b);
    55                 Element<V> aHead = findHead(aElement);
    56                 Element<V> bHead = findHead(bElement);
    57                 Integer aSize = sizeMap.get(aElement);
    58                 Integer bSize = sizeMap.get(bElement);
    59                 Element<V> big =aSize > bSize ? aHead : bHead;
    60                 Element<V> small = big == aHead ? bHead : aHead;
    61                 fatherMap.put(small,big);
    62                 sizeMap.put(big,aSize+bSize);
    63                 sizeMap.remove(small);
    64             }
    65         }
    66     }
    67 }

    并查集结构 可以快速查询是否在同一个集合 

    快速集合合并

  • 相关阅读:
    MySql相关
    RabbmitMQ 的配置及开启MQTT服务
    cmake 编译.so or .a文件很大问题
    模型上移动端遇到简单的问题:No variants found for 'app'
    第一次用go mod模式创建beego1.12的步骤
    python中RabbitMQ的使用hello world简单模式
    Ubuntu18.04 20.04安装rabbitMQ
    Django的mysqlclient报错
    《软件需求》读书笔记六
    《软件需求》读书笔记五
  • 原文地址:https://www.cnblogs.com/isnotnull/p/15068130.html
Copyright © 2011-2022 走看看