簡而言之,我試圖從規範的霍夫曼列表中生成霍夫曼代碼。本質上,應運行以下兩個循環,並生成一個二進制字符串。的代碼是: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