2013-04-14 68 views
0

我的整个项目是创建一个树并使用霍夫曼编码来对给定文件进行编码和解码。我处于需要解码文件的地步。要做到这一点,我不得不通过我的霍夫曼树,直到我到达最底部的叶子,然后返回该叶子代表的字节。我根据为该方法提供的位串来遍历树。如果当前位是1,我会去树中的childOne,等等。问题是我不断收到outOfMemory错误。有没有什么办法来优化这段代码,以便它不会占用太多内存?有没有办法优化这段代码,以避免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 。基本上,有没有更好的方法来完成这件事?

回答

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

那好吧。我想这是有道理的。这只是作业作业,建议使用递归算法。 – art3m1sm00n

+0

好的。它不会像算法那么好,但它显然不会在没有改变的情况下工作。谢谢! – art3m1sm00n

+0

@ GabrielleLee递归是一种优雅而简单易懂的方法,但并不总是有效。 – vidit

0

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

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

addByte(curNode, bigArray) 

让你去通过这个循环中的位,将代表的字节,当你到叶子,然后继续上 - 无需所有的堆栈帧递归都涉及到。

0

另外,考虑使用低级数据结构,如java.util.BitSet而不是List<Integer>java.io.ByteArrayOutputStream而不是ArrayList<Byte>

0

如果递归是你的问题,你很可能会得到堆栈溢出错误。当你正在运行的内存,我建议你看看:

  • 务必在每次通话后丢弃bitArrayfinalArray
  • 使用流输出到。
  • 使用BitSet作为bitArray。
  • 请确保您不是无意中在您的树中创建循环。
相关问题