1. 程式人生 > >Huffman樹與檔案壓縮的原理

Huffman樹與檔案壓縮的原理

1、Huffman樹的簡單介紹以及帶權路徑長度的求解

       Huffman樹,又稱為最優二叉樹,是加權路徑長度(weighted path length)最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度。
        下面,我要用一個簡單的陣列構造一棵Huffman樹,然後再求其加權路徑長度:

a[]={0,1,2,3,4,5,6,7,8,9};

這裡寫圖片描述

從圖片裡我們可以看到數組裡面的元素都成了Huffman樹的葉子節點(它總是從數組裡面找到最小的兩個元素開始構造,再把兩個數之和放回陣列,重複上述過程)。
那麼這棵樹的帶權路徑長度是多少呢?wpl=4*3+5*3+9*2+0*6+1*6+2*5+3*4+6*3+7*3+8*3

2、如何利用haffman編碼實現檔案壓縮

(1)統計檔案中字元出現的次數,例如:input.txt檔案中存放的有以下內容:

aaaabbbccd

經過統計:a——4次;
                  b——3次;
                  c——2次;
                  d——1次;

(2)用(1)中的統計結果來構造haffman樹:
這裡寫圖片描述
(3)根據haffman樹生成haffman編碼(路徑左邊記為0,右邊記為1):

a的編碼為 1
b的編碼為 01
c的編碼為 001
d的編碼為 000

(4)壓縮

原始檔內容為:aaaabbbccd
將原始檔用對應的haffman code替換,則有:11110101 01001001 00011111

需要注意的是:haffman code 末尾的5個1是用來補位用的,為了湊夠整數個位元組,方便計算機的處理和運算。

由此可見,原始檔一共有10個字元,佔10位元組的記憶體,但是經過用haffman code替換之後,只佔3個位元組,這樣就能達到壓縮的目的

(5)解壓縮

       解壓縮的過程就是一個還原原始檔的過程,一個字元一個字元的順序讀取haffman編碼的內容,讀到葉子節點就進行還原,沒讀到就繼續向下讀。

3、關於檔案壓縮的常見問題

        到這裡,我們已經初步瞭解了檔案壓縮的基本原理,但是我們可以再深入討論幾個問題:
(1)為什麼檔案可以被壓縮?
       檔案壓縮的原理是把檔案中的重複資料用更簡潔的方法來表示和儲存,例如一個檔案中有1000個字母A,那麼這將佔用1KB的資料空間,如果用壓縮演算法就可以用1000A來表示,那麼它只需要5個位元組的資料空間,壓縮比達到了200倍。但是通常來說,我們在生活中使用的檔案不可能存在這麼多的重複資料,所以一般來說,檔案壓縮比只能達到10倍以下。
(2)什麼情況下壓縮效果好?
       由第一個問題,我們可以知道,當檔案中重複資料非常多的時候,壓縮比比較高,這時候,壓縮效果也是最好的。換一句話說,在用貪心演算法構建haffman樹的時候,出現頻率高的資料和出現頻率低的資料差距特別大的時候,壓縮效果是比較好的。
(3)什麼情況下壓縮效果差?
       當重複字元出現次數都差不多的時候或者檔案中沒有出現重複字元的時候,壓縮效果是很差的。(有時候也會出現檔案越壓縮越大的情況)

PS:詳細分析過程請點選以下連結: