Java 有没有办法优化这段代码以避免outOfMemory错误?

Java 有没有办法优化这段代码以避免outOfMemory错误?,java,arrays,recursion,arraylist,tree,Java,Arrays,Recursion,Arraylist,Tree,我的总体项目是创建一棵树,并使用哈夫曼编码对给定文件进行编码和解码。我现在需要解码我的文件。为此,我必须一步一步地遍历我的哈夫曼树,直到到达最底层的一个叶,然后返回该叶表示的字节。我根据给方法的位字符串遍历树。如果当前位为1,我将转到树中的childOne,以此类推。问题是,我不断收到一个outOfMemory错误。有没有办法优化这段代码,使它不会占用那么多内存 public static int decode(List<Integer> bitArray, HuffmanN

我的总体项目是创建一棵树,并使用哈夫曼编码对给定文件进行编码和解码。我现在需要解码我的文件。为此,我必须一步一步地遍历我的哈夫曼树,直到到达最底层的一个叶,然后返回该叶表示的字节。我根据给方法的位字符串遍历树。如果当前位为1,我将转到树中的childOne,以此类推。问题是,我不断收到一个
outOfMemory
错误。有没有办法优化这段代码,使它不会占用那么多内存

    public static int decode(List<Integer> bitArray, HuffmanNode root, int startingPosition,
                          ArrayList<Byte> finalArray)
    {
    HuffmanNode childOne;
    HuffmanNode childZero;
    int currentBit = bitArray.get(startPosition);
    byte newByte;

            childOne = root.getChildOne();
            childZero = root.getChildZero();
            if(childOne == null && childZero == null)
            {
               finalArray.add(root.getByteRepresented()); 
               return startPosition;
            } 
            else if(currentBit == 1)
            {
                startPosition++;
                startPosition = decode(bitArray,childOne,startPosition,finalArray);
            }
            else
            {
                startPosition++;
                startPosition = decode(bitArray,childZero,startPosition,finalArray);
            }

         return startPosition;

}
公共静态整数解码(列表位数组、HuffManode根、整数起始位置、,
ArrayList finalArray)
{
赫夫曼诺德·奇尔顿;
赫夫曼诺德儿童中心;
int currentBit=bitArray.get(startPosition);
字节新字节;
childOne=root.getChildOne();
childZero=root.getChildZero();
if(childOne==null&&childZero==null)
{
add(root.getByteRepresented());
返回起始位置;
} 
else if(当前位==1)
{
startPosition++;
startPosition=解码(位数组、childOne、startPosition、finalArray);
}
其他的
{
startPosition++;
startPosition=解码(位数组、childZero、startPosition、finalArray);
}
返回起始位置;
}

我需要知道它在位数组中结束的位置,并将指定的字节放入数组,这就是为什么我将字节放入方法中的数组并返回和int。基本上,有没有更好的方法来完成这项工作?

是的,有。将递归更改为迭代

temp = root;
childOne = temp.getChildOne();
childZero = temp.getChildZero();
while(childOne != null && childZero != null) {
  currentBit = bitArray.get(startPosition++);
  if (currentBit == 1) {
    temp = childOne;
  } else {
    temp = childZero;
  }
  childOne = temp.getChildOne();
  childZero = temp.getChildZero();
}

我不知道事情有多大,但我认为你不需要递归。你不能用这样一个循环做你需要的事情吗:

while (curNode.isNotLeaf())
{
  if (currentBit == 1) curNode = curNode.getChildOne();
  else curNode = curNode.getChildZero();
  currentBit = nextBit;
}

addByte(curNode, bigArray)

因此,您在这个循环中遍历您的位,在到达叶子时添加表示的字节,然后继续—不需要递归涉及的所有堆栈帧。

,考虑使用诸如BitSet、java、UTI.java、<代码>等低级数据结构,而不是<代码>列表和<代码> java. IO。BytEARRayOutsPoxs而不是<代码> ARARYLIST/<代码> .< /P> < P>如果递归是您的问题,则很可能会导致堆栈溢出错误。由于您的内存不足,我建议您查看:

  • 确保在每次调用后丢弃
    bitArray
    finalArray
  • 使用要输出到的流
  • 对位数组使用
    位集
  • 确保您没有意外地在树中创建循环

查看压缩位集实现,如 OpenBitSet(Lucene)

哦,好的。我想这是有道理的。这只是一个家庭作业,建议我使用递归算法。好的。它不会像算法那样好,但如果不改变它显然是行不通的。谢谢@GabrielleLee-递归是一种优雅且易于理解的方法,但并不总是有效的。