Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java循环和移位_Java_Loops_Binary_Bit Shift_Huffman Code - Fatal编程技术网

Java循环和移位

Java循环和移位,java,loops,binary,bit-shift,huffman-code,Java,Loops,Binary,Bit Shift,Huffman Code,长话短说,我试图从一个规范的哈夫曼列表中生成哈夫曼代码。本质上,应该运行以下两个循环,并生成一个二进制字符串。代码是: 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

长话短说,我试图从一个规范的哈夫曼列表中生成哈夫曼代码。本质上,应该运行以下两个循环,并生成一个二进制字符串。代码是:

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
            }
        }

    }
这是正确的,并且生成了正确的哈夫曼代码。但是,在第二个长度数组上运行它会产生以下结果:

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

我认为我的问题在于嵌套循环,但是我不明白为什么它在一次运行中工作得很好,而在另一次运行中却失败了

我可能只是错过了一些明显的东西,但我看不见

如有任何建议,将不胜感激

谢谢

更新


在回顾我的代码之后,看起来我在读取数据时实际上犯了一个小错误,因此我得到了不正确的哈夫曼代码

第二个示例中的前两个代码都有长度为1的代码,在前两个代码之后没有其他可能的代码。所有前缀模式都已用完

您的代码应该保留可用剩余代码的计数,以检测错误输入。只需减少每个代码的计数,并在每次向上移动到下一个长度(比当前长度大一倍)时将计数加倍。(确保即使没有该长度的代码,也要加倍,例如,如果从长度为3的代码移动到长度为5的代码,则即使没有长度为4的代码,也要加倍计数。)对于长度为1的代码,从2开始计数

如果计数为负数,你就有一个错误,你可以在那里停止。无法将代码分配给该组长度


如果进程结束时计数不为零,则代码不完整。这可能是错误,也可能不是错误,具体取决于您的应用程序。这意味着代码不是最优的,可以使用更少的位来编码这些符号。

您正在不断更新代码。哈夫曼代码根据您已经看到的值进行更改是正常的。您的另一个问题是无法知道您的值停止在哪里,例如,
1011000
4144111或581我不太清楚您的意思,Peter?我必须承认我仍然对哈夫曼密码有点困惑。你能详细说明一下吗?我想你是在提前生成哈夫曼密码,或者你的问题没有意义。通常在处理每个符号时更新哈夫曼代码。这意味着一个代码意味着一个符号以后可能意味着另一个符号。我生成的代码来自存储在已压缩流中的规范列表。我只是想找出正确的代码,然后保存它。上面显示的两个示例都来自两个不同的规范列表。我想我越来越糊涂了:)我确实看到了。我有一种感觉,一开始我读错了数据。我得回去看看我的输入法。谢谢你,彼得。