【问题标题】:Is there a way to optimize this code so that I avoid outOfMemory error?有没有办法优化这段代码以避免 outOfMemory 错误?
【发布时间】:2013-04-06 19:04:47
【问题描述】:

我的总体项目是创建一棵树并使用 Huffman 编码对给定文件进行编码和解码。我正需要解码我的文件。为此,我必须遍历我的霍夫曼树,直到到达最底部的叶子,然后返回由该叶子表示的字节。我根据给方法的位串遍历树。 AKA 如果当前位为 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;

}

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

【问题讨论】:

    标签: java arrays recursion arraylist tree


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

      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();
      }
      

      【讨论】:

      • 哦,好的。我想这确实有道理。这只是一个家庭作业,建议我使用递归算法。
      • 好的。它不会像算法那么好,但如果不改变它显然不会工作。谢谢!
      • @GabrielleLee- 递归是一种优雅且易于理解的方法,但并不总是有效的。
      【解决方案3】:

      如果递归是您的问题,您很可能会遇到堆栈溢出错误。由于您的内存不足,我建议您查看:

      • 请务必在每次调用后丢弃 bitArrayfinalArray
      • 使用流输出到。
      • 为 bitArray 使用 BitSet
      • 确保不会意外在树中形成循环。

      【讨论】:

        【解决方案4】:

        另外,请考虑使用较低级别的数据结构,例如 java.util.BitSet 代替 List&lt;Integer&gt;java.io.ByteArrayOutputStream 代替 ArrayList&lt;Byte&gt;

        【讨论】:

          【解决方案5】:

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

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

          所以你在这个循环中遍历你的位,当你离开时添加表示的字节,然后继续 - 不需要所有的堆栈帧递归。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-31
            • 1970-01-01
            • 1970-01-01
            • 2011-05-16
            • 2019-04-07
            • 1970-01-01
            相关资源
            最近更新 更多