如何解决尝试将元素从 B+Tree 添加到 ArrayList 时出现 OutOfMemoryError
我正在尝试遍历 B+ 树,并使用以下代码将叶子中的元素添加到 ArrayList 中:
public void toArrayList(Node node){
Node currentNode = node;
if(currentNode instanceof InnerNode){
InnerNode inner = (InnerNode) currentNode;
int i = 0;
int temp = inner.children.length;
while(i < temp){
currentNode = inner.children[i];
toArrayList(currentNode);
i++;
}
}
if(currentNode instanceof LeafNode){
LeafNode leaf = (LeafNode) currentNode;
int j = 0;
int temp = leaf.values.length;
while(j < temp){
if(leaf.values[j] != null) {
retArray.add(leaf.values[j]);
}
j++;
}
}
}
它所做的是检查节点是内部节点还是叶节点的实例。如果它是一个内部节点,它会递归地调用它的每个子节点的函数。如果它是叶节点,那么它会将值添加到 ArrayList 中。但是,在运行此功能时,我最终得到了一个 java.lang.OutOfMemoryError
。
有没有办法让我的代码更高效,或者我应该对这种方法采取不同的方法?
解决方法
除非您的树结构中有几百万个元素,否则这里发生的是某些 InnerCode 包含自身,因此此代码将永远运行,或者至少直到您的 retArray
填满为止。
另请注意,如果叶节点是内部节点的最后一个子节点,则此代码将添加两次叶节点。我强烈建议你不要像这样覆盖本地人。此外,这里的 for 循环更加紧凑(请注意,缩小此代码对于内存问题根本没有任何影响;OOMError 指的是堆,而本地人并不住在那里) .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。