HuffmanTree 檔案壓縮

2021-09-20 15:48:37 字數 1268 閱讀 2480

一、首先要知道哈弗曼樹的原理: 

如果有一些結點的權值分別是0,1,2,3,4,5,6,7,8,9

構建出的huffmantree是什麼?  

二、哈弗曼樹的構建: 

因為每次選擇權值最小的兩棵樹構建新的樹,因此使用堆來實現,自然這裡需要構建最小堆;

三、檔案壓縮的原理: 

檔案壓縮需要的是哈夫曼編碼,對於上面的huffmantree,怎樣來進行編碼呢?

從根節點開始,根節點的右支編碼為1,而左支編碼為0,依次遞迴下去,得到如下編碼圖: 

哈夫曼編碼只是對葉子節點編碼;而且可以發現權值越小的,它的哈夫曼編碼越長,權值越大的,哈夫曼編碼越短。 

那如何運用到檔案壓縮中呢? 

舉乙個簡單的例子吧,假設有乙個檔案的內容是「abbcccdddd「,『a』出現的次數是1,『b』出現的次數是2,『c』出現的次數是3,『d』出現的次數是4,以各字元出現的次數構建乙個哈夫曼樹,並為各字元編碼,結果是: 

『a』:100;  『b』:101;  『c』:11;  『d』:0; 

以編碼的形式按照原字元的順序寫入壓縮檔案,就應該是這樣滴: 

1001011011111110000 

這乙個0或1代表乙個二進位制位,那壓縮檔案是多大呢?3個位元組 

原檔案是多大呢?10個位元組 

這就是檔案壓縮的原理。 

四、檔案壓縮的過程: 

根據上面的例子,首先要統計待壓縮檔案中各字元出現的次數,然後構造huffmantree,得到編碼,把編碼寫入壓縮檔案,不夠乙個位元組的就在後面補零,為了實現解壓縮,需要將每個字元出現的次數寫入配置檔案。 

五、檔案解壓縮的過程: 

通過配置檔案,構建huffmantree得到哈弗曼編碼,根據壓縮檔案裡的編碼到huffmantree裡面找,找到葉子結點,就把葉子節點的字元寫入解壓縮檔案中。 

貪心演算法 Huffman Tree

huffuman 編碼問題 變長編碼 variable length code 可以達到比定長編碼好很多的壓縮率,其思想史賦予高頻字元短碼字,低頻字元長碼字。字首碼 prefix code 可以保證 沒有任何碼字是其他碼字的字首。赫夫曼編碼採用依賴於貪心演算法選擇性質和最優子結構 構造最優字首碼。其...

資料結構 HuffmanTree

1 掌握二叉樹的定義 2 掌握哈夫曼樹和哈夫曼編碼演算法的實現。實現乙個哈夫曼編碼系統,系統包括以下功能 1 字元資訊統計 讀取待編碼的原始檔sourcefile.txt,統計出現的字元及其頻率。2 建立哈夫曼樹 根據統計結果建立哈夫曼樹。3 建立哈夫曼碼表 利用得到的哈夫曼樹,將各字元對應的編碼表...

資料結構 HuffmanTree

1 掌握二叉樹的定義 2 掌握哈夫曼樹和哈夫曼編碼演算法的實現。實現乙個哈夫曼編碼系統,系統包括以下功能 1 字元資訊統計 讀取待編碼的原始檔sourcefile.txt,統計出現的字元及其頻率。2 建立哈夫曼樹 根據統計結果建立哈夫曼樹。3 建立哈夫曼碼表 利用得到的哈夫曼樹,將各字元對應的編碼表...