【數據壓縮】Exp03.HUffman_Coding霍夫曼編碼及其編碼效率分析

實驗原理:

霍夫曼編碼是一種無失真的信源編碼,其基本思想是對於概率大的符號用短碼錶示,對概率小的符號用長碼錶示,從而使得編碼後的信源的平均碼長接近香農定理中給出的變長編碼平均碼長的下界H(X)/logr。爲了使得編碼得到的碼字爲即時碼,在程序中使用二叉樹來對信源進行編碼。

霍夫曼編碼的步驟如下:


第一步:將文件讀入緩存區;

第二步:之字形掃描,統計信源的各符號的概率;

第三步:按照概率排列信源符號,將兩個最小的概率作爲二叉樹的樹葉節點,兩個概率的和作爲根節點,在將新的節點(樹葉節點不參與比較)重新排序,選出概率最小的作爲樹葉節點,重複該步驟直到最終的根節點概率爲1,碼樹生成結束;

第四步:將碼錶及其他信息寫到輸出文件,寫碼錶時採用深度優先的遍歷方法,將形成的二叉樹所有左節點標0,右節點標1,再從根節點向下讀,得到每個信源符號的碼字,形成完整的碼錶;

第五步:對原文件進行再次掃描並編碼輸出。

實驗代碼分析:

第一步:先看代碼中的三個結構體,從結構體可以看數據存儲的結構:

Huffman節點:


Huffman碼字結構體:


存統計信息的結構體:


第二步:根據編碼的過程分析代碼:

01.第一次掃描文件,得到256個符號對應的頻率,並創建256個huffman_node(樹葉節點),得到符號頻率的代碼如下:


02.根據得到的符號頻率生成一棵霍夫曼樹,從樹葉->根,並根據生成的樹從根到樹葉採用深度優先的遍歷方法得到每個符號對應的碼字,代碼如下:




03.將生成的碼錶寫到輸出文件中,代碼如下:


04.再次掃描文件,將每個符號對應的碼字寫入到輸出文件中,代碼如下:


實驗結果分析:

將十種不同格式的文件進行霍夫曼編碼,下列是十種不同格式文件符號概率分佈圖:






十個文件的統計信息如下表所示:


根據結果可以看出,不同的文件編碼效率有所差異。對於符號概率分佈越不均勻的信源,其編碼效率更高,壓縮得越好,由於編碼後的文件中存入了碼錶,因此由結果看來,原文件越大,其壓縮比才更小。對於一些信源符號概率分佈較爲均勻,且文件大小較小的文件如本實驗中的gif文件和rar文件,其編碼後的文件大小與原文件相差不大甚至可能比原文件更大,就是因爲碼錶的原因。

通過該實驗,可以驗證霍夫曼編碼的編碼效率是比較高的,編碼後的平均碼長與香農定理中給出的變長編碼碼長的下界很接近了。也可以看出熵編碼對於概率分佈不均的信源其壓縮效果更好,因此在實際操作中應儘量信源轉換爲概率分佈不均的模型後再對其進行熵編碼。除了驗證了霍夫曼編碼的效率外,還通過該實驗瞭解了數據結構和數據的存儲方式等相關的知識。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章