簡體   English   中英

BitSet內存不足Java

[英]BitSet out of memory Java

我正在使用BitSet來跟蹤是否已使用DFS方法訪問了Graph中的節點。 為此,我創建了一個BitSet []數組。 BitSet本身可以在100.000-500.000個條目之間。

這是我正在使用的代碼。

   public void tc() {
//        if (scc_cache_valid)
//           return;
        marked2 = new BitSet[node_count];
        for (int v = 0; v < node_count; v++) {
            //if (marked2[v] == null)
                marked2[v] = new BitSet(edge_count);
            System.out.println("aaa" + marked2[v].size());
            for (int w : children.get(v)) {
                if (!marked2[v].get(w))
                    dfs(v, w);
            }
        }
    }

    public void tc(int v) {
//        if (scc_cache_valid && marked2[v] != null)
//            return;

//        marked2 = new BitSet[node_count];
//        for (int v = 0; v < node_count; v++) {
        if (marked2[v] == null)
            marked2[v] = new BitSet(node_count);
        System.out.println(marked2[v].size());

        for (int w : children.get(v)) {
                if (!marked2[v].get(w))
                    dfs(v, w);
            }
//        }
    }

    public boolean reachable(int v, int w) {
        return marked2[v].get(w);
    }

    private void dfs(int v, int w) {
        marked2[v].set(w, true);
        System.out.println(marked2[v].length());

        for (int z : children.get(w)) {
            if (!marked2[v].get(z))
                dfs(v, z);
        }
    }

不幸的是我快要用光了。 是否有更好的(更有效的內存使用)解決方案?

謝謝。

我認為您的DFS算法不正確。

  • 一棵樹的經典DFS算法根本不需要位圖。
  • DAG或完整圖的經典DFS算法需要單個位圖,圖中的每個節點都需要一個位。 假設從節點到整數存在(密集)一對一的映射。 例如節點號。 如果不是,則通常使用HashSet<Node>

無論哪種情況,空間需求都是O(N)而不是O(N^2)

DAG /圖情況的偽代碼算法為:

 dfs(root) = dfs0(root, new Set());
 dfs0(node, visited) = 
      if !visited.contains(node):
          visited.add(node)
          // do stuff for node
          foreach n in node.children:
              dfs0(n, visited)

注意:遍歷中僅使用一個Set對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM