【问题标题】:java hashMap Adjacency Lists graph partitionjava hashMap Adjacency Lists 图分区
【发布时间】:2016-09-16 19:37:59
【问题描述】:

我有一个 HashMap:

Key,Value
A,C
B,C
C,D
E,F

这是一个邻接列表。带有两个分区的图,其中第一个分区包含节点 {A,B,C,D},第二个分区是 {E,F}。

问题:给定一个表示邻接列表的 HashMap 返回分区。

换句话说:

Input: {[A,C],[B,C],[C,D],[E,F]}
Output: {[A,B,C,D],[E,F]}

Java 中的一些解决方案/算法可以解决这个问题???

Ps:不限于Java,欢迎任何帮助:)

Tks 提前 :)

【问题讨论】:

    标签: java graph hashmap partition adjacency-list


    【解决方案1】:

    您可以为此使用任何图形遍历技术(BFS 或 DFS)。

    例如,如果您使用的是 BFS:

    • 从任意节点开始(比如 X)。

    • 访问完所有连接到该节点的节点后,检查是否访问了图的所有节点。如果遇到没有访问过的节点,从这个节点启动一个新的 BFS,这将是你的第二个分区。

    • 等等……

    在您的情况下,如果您从 A 启动 BFS,它将访问 [C, B, D]。这是第一个分区。

    现在您检查图 (E) 中是否有未访问的节点。所以,现在你从 E 开始一个 BFS,你访问的所有节点都在第二个分区中。

    【讨论】:

      【解决方案2】:

      IMO 最好的解决方案是Union-Find algorithm

      public class UnionFind {
          Map<String, String> parents = new HashMap<>();
          Map<String, Integer> representantElements = new HashMap<>();
      
          public void union(String p0, String p1) {
              String cp0 = find(p0);
              String cp1 = find(p1);
              if (!cp0.equals(cp1)) {
                  int size0 = representantElements.get(cp0);
                  int size1 = representantElements.get(cp1);
                  if (size1 < size0) {
                      String swap = cp0;
                      cp0 = cp1;
                      cp1 = swap;
                  }
                  representantElements.put(cp0, size0 + size1);
                  parents.put(cp1, cp0);
                  representantElements.put(cp1, 0);
              }
          }
      
          public String find(String p) {
              if (!representantElements.containsKey(p)){
                  representantElements.put(p, 1);
                  return p;
              }
              String result = parents.get(p);
              if (result == null) {
                  result = p;
              } else {
                  result = find(result);
                  parents.put(p, result);
              }
              return result;
          }
      
          public Set<Set<String>> getPartitions() {
              Map<String, Set<String>> result = new HashMap<>();
              representantElements.forEach((key, value) -> {if (value > 0) {result.put(key, new HashSet<>(value));};});
              representantElements.forEach((key, value) -> result.get(find(key)).add(key));
              return new HashSet<>(result.values());
          }
      
          public static Set<Set<String>> partitions(String[][] pairs) {
              UnionFind groups = new UnionFind();
              for (String[] pair : pairs) {
                  if (pair.length > 1) {
                      String first = pair[0];
                      for (int i = 1; i < pair.length; i++) {
                          groups.union(first, pair[i]);
                      }
                  }
              }
              return groups.getPartitions();
          }
      
          public static void main(String[] args) {
              String[][] elements = {{"A","C"},{"B","C"},{"C","D"},{"E","F"}};
              for (Set<String> partition : partitions(elements)) {
                  System.out.println(partition);
              }
          }
      }
      

      打印出来:

      [A, B, C, D]
      [E, F]
      

      【讨论】:

      • 现在我将尝试将其应用于 Map> 元素 TKS A LOT !!!!
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多