一、首先要知道哈弗曼樹的原理:
如果有一些結點的權值分別是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 建立哈夫曼碼表 利用得到的哈夫曼樹,將各字元對應的編碼表...