简而言之,我试图从规范的霍夫曼列表中生成霍夫曼代码。本质上,应运行以下两个循环,并生成一个二进制字符串。的代码是:Java循环和移位
for (int i = 1; i <= 17; i++) {
for (int j = 0; j < input.length; j++) {
if (input[j] == i) {
result.put(allocateCode(i, j), j); //update a hashmap
huffCode += (1 << (17 - i)); //Update the huffman code
}
}
}
本质的代码应该寻找所有代码为1的长度,并生成用于每个霍夫曼码。例如,长度为1(按顺序):0,1。三个长度将变为100,101,110。
allocateCode
函数只是返回一个显示结果的字符串,第一次运行产生这个:
Huffman code for code 2 is: 0 (0) length was: 1
Huffman code for code 6 is: 10 (2) length was: 2
Huffman code for code 0 is: 1100 (12) length was: 4
Huffman code for code 3 is: 1101 (13) length was: 4
Huffman code for code 4 is: 1110 (14) length was: 4
Huffman code for code 7 is: 11110 (30) length was: 5
Huffman code for code 1 is: 111110 (62) length was: 6
Huffman code for code 5 is: 111111 (63) length was: 6
这是正确的,并且已经生成了正确的霍夫曼代码。但是,在运行它的长度的第二阵列上产生这样的:
Huffman code for code 1 is: 0 (0) length was: 1
Huffman code for code 4 is: 1 (1) length was: 1
Huffman code for code 8 is: 100 (4) length was: 3
Huffman code for code 9 is: 100 (4) length was: 3
Huffman code for code 13 is: 101 (5) length was: 3
Huffman code for code 16 is: 1011000 (88) length was: 7
Huffman code for code 10 is: 10110001 (177) length was: 8
Huffman code for code 2 is: 101100011 (355) length was: 9
Huffman code for code 3 is: 101100011 (355) length was: 9
Huffman code for code 0 is: 1011001000 (712) length was: 10
Huffman code for code 5 is: 1011001000 (712) length was: 10
Huffman code for code 6 is: 1011001001 (713) length was: 10
Huffman code for code 7 is: 10110010011 (1427) length was: 11
Huffman code for code 14 is: 10110010011 (1427) length was: 11
Huffman code for code 17 is: 10110010100 (1428) length was: 11
Huffman code for code 19 is: 10110010100 (1428) length was: 11
Huffman code for code 18 is: 101100101010000 (22864) length was: 15
正如你可以看到,产生相同的代码多次,实例是代码8 & 9,和码2 & 3.
我认为我的问题存在于嵌套循环中,但是我无法弄清楚为什么它对于一次运行完美运行,并且在另一次运行时失败。
我可能只是缺少明显的东西,但我不能看到它好看。
任何意见将不胜感激。
感谢
UPDATE
回去通过我的代码后,似乎我首先在数据读取时,实际上做的一个小错误,所以我得到不正确的霍夫曼码!
您正在更新代码。 huffman代码根据您已经看到的值进行更改是正常的。您遇到的另一个问题是无法知道您的值停止在哪里是'1011000' 4144111或581 – 2013-05-12 10:46:02
我不太确定你的意思是彼得?我必须承认,霍夫曼编码仍然让我感到困惑。你能详细说明一下吗? – Tony 2013-05-12 10:47:07
我假设你提前生成你的huffman代码或者你的问题没有意义。通常,在处理每个符号时更新huffman代码。这意味着一个代码意味着一个符号可能意味着一个不同的符号。 – 2013-05-12 10:49:38