在課堂上,我們學習了哈夫曼編碼的原理和實現方法,上實驗課時也動手實現過,後來我們又追加介紹了哈夫曼編碼的實際壓縮和解壓縮的實現方法,並且在課堂上也演示了,但當時我們卻忽略了乙個環節,那就是實際檔案儲存時,二進位制是位元位,而儲存的單位一般是位元組,顯示時又是按照十六進製制的。現在給你乙個由字典裡的字元組成的原文,用哈夫曼方法把該原文壓縮成十六進製製碼。
input
本問題有多組測試資料,第一行就是測試資料的組數ncase,對於每組測試資料,一共有四個部分,第一部分是乙個字典(請注意,字典裡可能含有空格!),原文本裡面出現的任何字元一定在這個字典裡面,並且已經按照使用頻度從大到小順序排列。第二部分是字典裡相對應字元的使用頻度。第三部分是原文的行數n(1<=n<=100)。第四部分是n行原文。
output
輸出一共n行,每行就是原文對應的十六進製制壓縮碼。
特別說明:
1:由於哈夫曼編碼可能不一定唯一,因此我們規定在構建哈夫曼樹時,左子樹編碼為0,右子樹編碼為1,左子樹代表的頻度資料小於右子樹代表的頻度資料,如果兩個頻度資料相同,則以生成早的為左子樹,如果在字典裡出現相同頻度的字元,則原排在前的為左子樹。這樣規定目的是確保哈夫曼編碼唯一。
2:如果在壓縮過程中,用哈夫曼方法壓縮後二進位製碼的長度不是8的倍數,在碼的最後添數字『0』使其長度成為8的倍數(注意最多添7個『0』)。
sample input
1aorst
60 22 16 13 6 43ao
asao rst atoaats osaatrr rrasto
stroar ssrtoaaa
sample output
7cf3f2cc3c6fe24d3fc5ab7cc6
98bbd266c6ff80
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct tree
;tree
(int now,
int w,string str)
tree
(int now,
int w,string str,
int l,
int r)
friend bool operator<
(tree a,tree b)};
int n,x,head;
string key,trans;
vector tree;
priority_queue q;
vector binary;
char hexa[20]
="0123456789abcdef"
;void
buildtree()
head=q.
top(
).now;
q.pop();
}void
tobinary
(int t,string s)
else
}int
main()
buildtree()
; cin>>n;
cin.
get();
while
(n--
) cout
clear()
;}tree.
clear()
;}}
哈夫曼編碼的乙個實際應用
本問題是來自於課堂上老師關於貪心問題的第三講.huffman編碼是最有效的二進位制編碼,其中貪心策略主要體現在根據頻度來設定編碼長度.最早在資料結構的便有學習到,當時採用的建樹方式是帶指標的結構體 小頂堆 使用小頂堆的優勢在於堆是動態的,同時也有較高的效率 插入和刪除並調整的效率約為o lgn 查詢...
哈夫曼樹的應用 哈夫曼編碼
include include include 樹結點定義 typedef struct htnode,huffmantree static char n 100 用於儲存正文 哈弗曼編碼,char型二級指標 typedef char huffmancode 封裝最小權結點和次小權結點 typede...
哈夫曼樹和哈夫曼編碼(檔案壓縮)
哈夫曼樹 huffman tree 帶權路徑長度 wpl 設二叉樹有n個葉子結點,每個葉子結點帶有權值wk,從根節點到每個葉子結點的長度為lk,則每個葉子結點帶權路徑長度之和就是 wk lk 求和 最優二叉樹或哈夫曼樹 wpl最小的二叉樹 哈夫曼樹的構造 每次把權值最小的兩棵二叉樹合併 1 huff...