本篇主要介紹如何利用哈夫曼編碼使檔案進行壓縮、如何構建哈夫曼樹
歡迎提出問題和建議
****:[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...