2013-05-12 37 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的代碼,計數加倍,也要確保你加倍。)開始兩次計數長度一個代碼。

如果計數曾經爲負,你有一個錯誤,你可以停在那兒。無法爲該組長度分配代碼。

如果在過程結束時計數不爲零,那麼你有一個不完整的代碼。根據您的應用程序,這可能是也可能不是錯誤。這意味着代碼不是最優的,可以使用更少的位來編碼這些符號。