OutOfMemoryError:ソートされた要素の配列をバイナリ検索ツリーの配列の実装に追加するJavaヒープスペースを取得しました。ランダムなIntegerの配列を追加することはできますが、ソートされた配列を追加しようとするとこの問題が発生します。ツリーのルートは、ソートされた配列の最小または最大の要素に設定されているので、残りの要素を追加すると、私の記憶を食べる極端に不均衡なツリーができます。これに関する助けは大いに感謝しています。あなたは、このようなAVLや赤黒木として、あなたのツリーに均衡しているいけない場合OutOfMemoryError:Javaヒープスペースアレイバイナリ検索ツリーにソートされた要素を追加する
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at bst.ArrayBinarySearchTree.resize(ArrayBinarySearchTree.java:386) at bst.ArrayBinarySearchTree.addElement(ArrayBinarySearchTree.java:26) at bst.Experiment.main(Experiment.java:90)
public void addElement(T element) {
if(isEmpty()){
count++;
array[1] = element;
}else{
int current = 1;
boolean added = false;
while (!added) {
if(current > (array.length-(array.length*.9))){
resize();
}
if (element.compareTo(array[current]) < 0){
if (array[current*2] == null) {
array[current*2]=element;
added = true;
} else
current = current*2;
} else{
if (array[current*2+1] == null) {
array[current*2+1]=element;
added = true;
} else
current = current*2+1;
}
} //while
}
count++;
}
private void resize(){
T[] temp = (T[])(new Comparable[2*array.length-(array.length/4)]);
for(int i=0; i<array.length; i++)
temp[i] = array[i];
array = temp;
}
ヒープダンプを取って分析することをお勧めします。要素が特定の順序で追加されているかどうかによって、ツリーがより多くのノードを持つ(そしてより多くのメモリを使用する)理由を考えることができる理由はありません。それは最適な配置ではないかもしれませんが、使用されるメモリは同じでなければなりません。 –
ツリー内にサイクルがあることがあります。これは、無期限の再帰/ループを引き起こしますか? – thumbmunkeys
ツリーがアンバランスであるという問題はありません。 (バランスの取れていないバイナリツリーは、バランスのとれたものより多くのメモリを使うべきではありませんが、いくつかの操作が遅くなります。)ソートされた要素を挿入すると、 –