2013-05-12 38 views
4

简而言之,我试图从规范的霍夫曼列表中生成霍夫曼代码。本质上,应运行以下两个循环,并生成一个二进制字符串。的代码是: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

回去通过我的代码后,似乎我首先在数据读取时,实际上做的一个小错误,所以我得到不正确的霍夫曼码!

+0

您正在更新代码。 huffman代码根据您已经看到的值进行更改是正常的。您遇到的另一个问题是无法知道您的值停止在哪里是'1011000' 4144111或581 – 2013-05-12 10:46:02

+0

我不太确定你的意思是彼得?我必须承认,霍夫曼编码仍然让我感到困惑。你能详细说明一下吗? – Tony 2013-05-12 10:47:07

+0

我假设你提前生成你的huffman代码或者你的问题没有意义。通常,在处理每个符号时更新huffman代码。这意味着一个代码意味着一个符号可能意味着一个不同的符号。 – 2013-05-12 10:49:38

回答

1

在第二个例子中都前两个代码具有一个长度,它的那些前两个后不留下其他可能的码。所有的前缀模式已经用完。

您的代码应该保持可用剩余码的计数来检测错误输入。简单地减少每个代码的计数,并且每次移动到下一个长度比当前长度多一倍时计数加倍。 (即使没有这种长度的代码,例如,如果你从长度为3的代码移动到长度为5的代码,即使没有长度为4的代码,计数加倍,也要确保你加倍。)开始两次计数长度一个代码。

如果计数曾经为负,你有一个错误,你可以停在那儿。无法为该组长度分配代码。

如果在过程结束时计数不为零,那么你有一个不完整的代码。根据您的应用程序,这可能是也可能不是错误。这意味着代码不是最优的,可以使用更少的位来编码这些符号。