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

2021-09-25 01:36:50 字數 1759 閱讀 4649

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

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...