Java 有没有办法优化这段代码以避免outOfMemory错误?
我的总体项目是创建一棵树,并使用哈夫曼编码对给定文件进行编码和解码。我现在需要解码我的文件。为此,我必须一步一步地遍历我的哈夫曼树,直到到达最底层的一个叶,然后返回该叶表示的字节。我根据给方法的位字符串遍历树。如果当前位为1,我将转到树中的childOne,以此类推。问题是,我不断收到一个Java 有没有办法优化这段代码以避免outOfMemory错误?,java,arrays,recursion,arraylist,tree,Java,Arrays,Recursion,Arraylist,Tree,我的总体项目是创建一棵树,并使用哈夫曼编码对给定文件进行编码和解码。我现在需要解码我的文件。为此,我必须一步一步地遍历我的哈夫曼树,直到到达最底层的一个叶,然后返回该叶表示的字节。我根据给方法的位字符串遍历树。如果当前位为1,我将转到树中的childOne,以此类推。问题是,我不断收到一个outOfMemory错误。有没有办法优化这段代码,使它不会占用那么多内存 public static int decode(List<Integer> bitArray, HuffmanN
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
- 使用要输出到的流
- 对位数组使用
位集
- 确保您没有意外地在树中创建循环
哦,好的。我想这是有道理的。这只是一个家庭作业,建议我使用递归算法。好的。它不会像算法那样好,但如果不改变它显然是行不通的。谢谢@GabrielleLee-递归是一种优雅且易于理解的方法,但并不总是有效的。