J'utilise BitSet pour savoir si les nœuds d'un graphique ont été visités à l'aide de la méthode DFS. Pour ce faire, j'ai créé un tableau BitSet []. Les BitSets eux-mêmes peuvent être compris entre 100.000 et 500.000 entrées.BitSet mémoire insuffisante Java
Ceci est le code que j'utilise.
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);
}
}
Malheureusement, je suis à court de tas. Y at-il une meilleure solution (plus de mémoire efficace) à ce problème?
Merci. Je pense que votre algorithme DFS est incorrect.
Avez-vous étendu l'espace mémoire de votre JVM? Par défaut, les paramètres max sont assez bas. – Andy
Combien de valeurs true/false au total avez-vous réellement besoin de stocker? – khelwood
Vous avez donc une matrice de 500 000 x 500 000? Cela prendrait 31 250 000 000 octets. Un bitmap est préférable pour les données non éparses. – RealSkeptic