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個空間,這樣就實現了一次壓縮。而在壓縮的過程中,不再多使用別的記憶體空間,又將這種...