2014-04-07 98 views
1

我用霍夫曼編碼壓縮了一個二進制文件。現在我正在努力尋找壓縮效率。如何使用霍夫曼編碼找到壓縮效率?

在我的二進制文件中,我有符號(0 & 1的buch)和頻率(符號的重複)。 假設我有:

  • 符號:0 FREQ:173
  • 符號:1頻率:50
  • 符號:2頻率:48
  • 符號:3頻率:45

目前每個符號都是在UInt64中編碼的,所以如果我的計算方法是正確的話,文件的大小應該是(173 + 50 + 48 + 45)* 8 = 2528字節。如果我錯了,請糾正我。在調試時我得到了2536,另外8我不知道爲什麼?

壓縮後我被編碼這樣

  • 符號:0碼:1
  • 符號:1代碼:00
  • 符號:2代碼:011
  • 符號:3編碼:010

請問有人能告訴我如何使用這些信息來獲得這個二進制文件的哈夫曼壓縮?我試圖在谷歌上搜索,但沒有二進制文件的樣本,他們有一些浮點類型的頻率,我無法理解如何將它們與我的二進制文件相關聯。

+1

霍夫曼實現在C++中的一個例子,如果它有幫助(包括doc):https://github.com/barakman/Huffman –

回答

1

你需要簡單的計算,你一共有多少位結束:

173 * 1 + 50 * 2 + 48 * 3 + 45 * 3 

這涉及到552位。轉換爲整個字節給我們69個字節。所以這是一個壓縮到69/2528或約3%的原始數據,假設解壓縮器可以知道字典等等。另外,假設您的輸入符號(0到3)是64位值,出於某種原因。

+0

請給我一個小算法來計算這些「1」,「2」和「3」編碼? – Sss

+1

@unwind你錯誤地比較了比特到字節,69字節到2528比特。比較552比特和2528比特,我們得到了〜22%的壓縮比。如果字典也必須存儲,那麼使用2位編碼可能會更好。 – Mathias

+0

@ user234839他正在計算符號頻率乘以代碼長度。符號2(011)具有3個比特,與符號3一樣,S1有兩個比特,S1只有一個。 – Mathias

0

根據提供的頻率樹是錯誤的。它必須是0 10 110 111它總是以所有正位結束。與霍夫曼樹不同的解決方案可以工作,但不提供最佳壓縮。