我正在使用BitSet來跟蹤圖中的節點是否已使用DFS方法訪問過。爲此我創建了一個BitSet []數組。 BitSets本身可以在100.000-500.000條目之間。BitSet內存不足Java
這是我正在使用的代碼。
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);
}
}
不幸的是我已經沒有了堆。有沒有更好的(更高效的內存)解決方案?
謝謝。
您是否擴展了JVM的堆空間?默認情況下,最大設置非常低。 – Andy
您實際需要存儲多少個真/假值? – khelwood
所以你基本上有一個500,000x500,000的矩陣?這將需要31,250,000,000字節。位圖對於非稀疏數據更好。 – RealSkeptic