基於哈夫曼編碼的檔案壓縮

2021-08-09 07:19:38 字數 2853 閱讀 3284

本篇主要介紹如何利用哈夫曼編碼使檔案進行壓縮、如何構建哈夫曼樹

歡迎提出問題和建議

****:[email protected]

**鏈結

哈夫曼樹

template

struct huffmannode

};

構建樹

huffman_tree 是構造出來的物件,size返回樹中結點個數

每取乙個 top 就 pop 一次,pop 函式自帶調整。

取到最後乙個時已經建立好 hfm 樹。

while (huffman_tree.size() >

1) _root = huffman_tree.top();

template

struct smallheap

};

if (null == root)

return;

_destory(root->_left);

_destory(root->_right);

delete root;

root = null;

while (huffman_node || !s_hf.empty())

}huffman_node = s_hf.top();

if (null == huffman_node->_left && null == huffman_node->_right)

s_hf.pop();

huffman_node = huffman_node->_right;

if (huffman_node)

}

注:_wt 是乙個結構體,包含了字元資訊,字元出現次數,字元的 hfm 碼,因為 _wt 是乙個結構體,不能直接進行比較,所以過載了一些符號。

struct fileinformation

fileinformation(const fileinformation& other_info)

fileinformation& operator()(const fileinformation& other_info)

fileinformation(size_t sz)

, _ch(0)

{}bool

operator

<(const fileinformation& other_info)const

bool

operator >(const fileinformation& other_info)const

bool

operator ==(const fileinformation& other_info)const

bool

operator !=(const fileinformation& other_info)const

fileinformation operator+(const fileinformation& other_info)

};

壓縮和解壓
char buf[256];

configinfo info;/*1*/

for (int i = 0; i < 256; ++i)

}info.count = -1;/*2*/

fwrite(&info, sizeof (configinfo), 1, fin);

/* 1 . 寫解壓檔案的配置資訊時,只需將字元和字元出現的次數寫入,並不需要 huffman_code (hfm 碼,string 類),並且這個物件可能很大,所以我們重新定義乙個結構體 configinfo ,其中只有字元和字元出現的次數。*/

/* 2 . 因為我們將解壓資訊寫入了壓縮檔案,所以需要乙個結束標誌,這個結束標誌就是讀到出現 -1 次的字元。*/

for (;;)

pos++;

if (8 == pos)}}

if (pos != 0)

}/* 從原檔案中讀到乙個字元,就從 fileinfo 陣列中找對應的 hfm 碼(fileinfo 是個陣列,每個元素是乙個 fileinformation 的結構體,總共 256 個, 存放所有的字元資訊。並且根據字元 ascii 碼對應的下標尋找),找到後根據 huffman_code (hfm 編碼)讓 value 按位 & 1,每讀夠八個位就將 value 寫入壓縮檔案。

*//* 如果讀到最後乙個字元時 value 沒有放滿,則補 0 */

至此壓縮完成,接下來進行解壓

configinfo info;

for (;;)

huffmantreeht(_fileinfo, charnum, 0);

/* 因為解壓檔案開始是解壓資訊,是 configinfo 結構體的二進位制,所以讀的大小是 sizeof (configinfo),一直讀到 " 結束標誌 "。

*/

huffmantreeht(_fileinfo, charnum, 0);

huffmannode* rt = ht.get_root();

huffmannode* cur = rt;

long

int pos = 7;

char value = 0;

value = fgetc(fop);

for (;;)

if (pos < 0)

}/* 此時讀到的字元二進位制是對應原始檔字元在 hfm 樹中的路徑,左 0,右 1,根據 hfm 樹,將對應的字元寫入解壓檔案。

*/

哈夫曼樹和哈夫曼編碼(檔案壓縮)

哈夫曼樹 huffman tree 帶權路徑長度 wpl 設二叉樹有n個葉子結點,每個葉子結點帶有權值wk,從根節點到每個葉子結點的長度為lk,則每個葉子結點帶權路徑長度之和就是 wk lk 求和 最優二叉樹或哈夫曼樹 wpl最小的二叉樹 哈夫曼樹的構造 每次把權值最小的兩棵二叉樹合併 1 huff...

基於Huffman哈夫曼編碼的檔案壓縮與解壓縮

一 實驗題目 用哈夫曼編碼實現檔案壓縮 二 實驗目的 了解檔案的概念 掌握線性鍊錶的插入 刪除等演算法 掌握huffman樹的概念及構造方法 掌握二叉樹的儲存結構及遍歷演算法 利用huffman樹及huffman編碼,掌握實現檔案壓縮的一般原理 三 實驗裝置與環境 微型計算機 windows 系列作...

哈夫曼編碼檔案壓縮解壓

哈夫曼編碼檔案壓縮解壓 沒整懂這份 竟然只能壓縮文字檔案,而且內容不能包含中文,不能解壓大於 8 k 的zip壓縮檔案 還有就是如果使用哈夫曼編碼壓縮的內容重複率不高,壓縮的效果不明顯,如果內容的重複率高壓縮的效果好點 呼叫封裝 public static byte hufmanzip byte b...