乙個哈夫曼編碼例項《壓縮一段字串》C

2021-10-21 02:21:38 字數 2418 閱讀 2727

1.統計詞頻

2.將詞頻資料放到優先佇列(priority_queue)中,並標記這些是葉子節點

3.新建乙個空節點,取出優先佇列中詞頻最小的兩個節點作為左右孩子,並把兩個詞頻相加。最後把新的節點再重新加到佇列中,直到佇列中只有乙個節點,此時哈夫曼樹就建立好了。

4.遍歷哈夫曼樹得到對映表

5.根據字串對應的哈夫曼編碼進行壓縮

//統計結果放到優先佇列裡

cout << "詞頻統計:" << endl;

priority_queue, tmp2> wordcount;

int showtimes = 0;

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

} }cout << endl << endl;

//根據優先佇列建立哈夫曼樹

while (wordcount.size() > 1)

word_count_node *huffmantree = wordcount.top();//取出哈夫曼樹

wordcount.pop();

//根據哈夫曼樹生成對映表

word_map w_map[128];//儲存對映資訊

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

getmap(huffmantree, w_map,0,0);//遍歷哈夫曼樹得到所有字母對映資訊

//列印對映表

cout << "哈夫曼編碼:" << endl;

showtimes = 0;

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

} }cout << endl << endl;

//根據對映壓縮字串

cout << "壓縮後的結果:" << endl;

計算儲存壓縮後的編碼長度

int bitcount = 0;

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

} 新建乙個空字串

unsigned char *encodestr;

encodestr = (unsigned char*)malloc((bitcount / 8 + 1) * sizeof(unsigned char));

for (int i = 0; i < (bitcount / 8 + 1); i++)

int index = 0;

int step = 0;

//遍歷源字串

for (int i = 0; i < str.length(); i++)

} }//給結尾加'\0'

for (int j = 0; j < w_map[0].bit; j++)

} double encoderate = (double)index / (double)str.length();

cout << endl << endl;

cout << "壓縮率=" << encoderate * 100 << "%" << endl << endl;

//解碼

cout << "解碼:" << endl;

index = 0;

step = 0;

char ch;

do while (ch != 0);

cout << endl;

return 0;

}

哈夫曼編碼的乙個實際應用(壓縮)

在課堂上,我們學習了哈夫曼編碼的原理和實現方法,上實驗課時也動手實現過,後來我們又追加介紹了哈夫曼編碼的實際壓縮和解壓縮的實現方法,並且在課堂上也演示了,但當時我們卻忽略了乙個環節,那就是實際檔案儲存時,二進位制是位元位,而儲存的單位一般是位元組,顯示時又是按照十六進製制的。現在給你乙個由字典裡的字...

哈夫曼編碼的乙個實際應用

本問題是來自於課堂上老師關於貪心問題的第三講.huffman編碼是最有效的二進位制編碼,其中貪心策略主要體現在根據頻度來設定編碼長度.最早在資料結構的便有學習到,當時採用的建樹方式是帶指標的結構體 小頂堆 使用小頂堆的優勢在於堆是動態的,同時也有較高的效率 插入和刪除並調整的效率約為o lgn 查詢...

深究字串壓縮 原地壓縮 哈夫曼壓縮(一)

深究字串壓縮系列一共兩大部分,會分別闡述原地壓縮演算法和哈夫曼演算法 本文主要內容是原地壓縮演算法。如果有乙個字串 a,a,a,b,b,c 如果直接這樣儲存,需6個空間,但如果將其壓縮成 a,3,b,2,c 則只需要5個空間,這樣就實現了一次壓縮。而在壓縮的過程中,不再多使用別的記憶體空間,又將這種...