學會哈夫曼樹怎麼實現壓縮檔案?

時間 2021-06-30 00:11:32

1樓:望山

你可以去Github看看cyan4973的FiniteStateEntropy的原始碼,它裡面除了FSE演算法,還有乙個HUFF0,是優秀的huffman編碼實現。這位作者是當今世界上最頂級的無失真壓縮大牛之一,LZ4的作者。

2樓:悽臨雨

壓縮時不在是文字,甚至不是以位元組為單位,而是以位為單位來儲存資料。

例如4個位元組=32個位,壓縮為13個位; 隨後 6個位元組壓縮成23個位。那麼一共要有13+23=36個位,儲存為 1 個位元組+2 個位元組≈5個位元組。

雖然說作業系統和語言提供的寫檔案函式都是以位元組為單位,你可以把不同資料的位混插起來存在同乙個位元組裡。

以十進位制簡單考慮,03(值域為兩位十進位制0~99) 和 004(值域為三位十進位制0~999),組合儲存就是03×1000+004 = 3004。

那麼二進位制的話,11011(值域為00000~11111),001001(值域為000000~111111)組合儲存就是

00000110 11;001001,用兩個位元組儲存.

實際上壓縮通常要先在壓縮包裡先儲存乙個哈夫曼樹,它本身比較佔體積,隨後再儲存轉換後的編碼(每個編碼並不是8位的倍數)。然而,應當是有辦法把ASC英文數字字元文字檔案壓縮為純文字檔案,需要盡量找到高頻詞彙。

3樓:GarfieldKwong

你看完了哈夫曼樹還不知道怎樣壓縮的話,建議你回去重新再看。看完了沒懂壓縮原理這只是看完,而沒有學到。

沒記錯的話,以文字為例,哈夫曼樹壓縮的原理是將高頻出現的字元用較短的編碼。最高頻的字元就壓縮編碼成 1bit. 例如最高頻的是字母e,壓縮後就用二進位制1表示,而次高頻的,例如g,就用而進製01表示。

說到底就是把原本恆長度的編碼變成變長編碼,所以就有了壓縮的效果。

另外,你的疑問很合理,壓縮後是不能存成文字檔案,只能存二進位制檔案,open 是要傳mode=b