最優字首碼實驗報告

2021-10-06 01:37:02 字數 986 閱讀 1661

實驗報告

課程名稱 《演算法分析與設計》 實驗日期 2020 年 5 月12日 至 2023年 5月 17日

學生姓名 戴昊宇 所在班級 計算機184 學號 2018212212015

實驗名稱 最優字首碼

實驗地點 同組人員 無

1.問題

對於任意給定的n個頻率f(x1),f(x2),…,f(xn),如何構造一棵對應於最優二元字首碼的二叉樹?

2.解析

二元字首碼:任何字元的**不能作為其它字元**的字首.eg.q=不是二元字首**,如序列0100001會產生歧義

設c=是n個字元的集合,f(xi)為xi出現的頻率,d(xi)為xi的碼長,i=1,2,…,n.

儲存乙個字元的平均二進位制位數(碼數):

nb=∑f(xi)d(xi)

i=1每個二元字首碼對應一棵二叉樹,樹葉代表碼字,樹葉的深度表示碼長,平均二進位制位數相當於這棵樹在給定頻率下的平均深度,也稱為這棵樹的權

對同一組頻率可以構造出不同的二叉樹,對應的平均二進位制位數也不同。占用位數越少的壓縮效率越高,即每個碼字平均使用二進位制位數最少的字首碼,稱為最優二元字首碼

如果葉片數n=2k,且每個碼字的頻率是1/n,那麼這棵樹應是一顆均衡的二叉樹

3.設計

huffman演算法:

輸入:c=字符集,每個字元的頻率f(xi),i=1,2,…,n.

輸出:q

1.n<-|c|

2.q<-c //按頻率遞增構成佇列 q

3.for i<-1 to n-1 do

4. z<-allocate-node()

5. z.left<-q中最小元 //取出q中最小元作為z的左兒子

6. z.right<-q中最小元 //取出q中最小元作為z的右兒子

7. f(z)<-f(x)+f(y)

8. insert(q,z)

9.return q

4.分析

演算法複雜度:o(nlogn)

5.原始碼

最優字首碼問題

構造最優字首碼的貪心演算法就是哈夫曼演算法 哈夫曼編碼 對於一顆具有n個葉子的哈夫曼樹,若對樹中的每個左分支賦予0,右分支賦予1,則從根到每個葉子的路徑上,各分支的賦值分別構成乙個二進位制串,該二進位制串就成為哈夫曼編碼。哈夫曼樹滿足兩條性質 性質證明如下 參考自 嚴蔚敏 資料結構教材 q c 頻率...

最優字首碼問題

1.問題 給定字符集c 和每個字符集的頻率f xi 求關於c的乙個最優字首碼。2.解析 構造最優字首碼的貪心演算法就是哈夫曼演算法 huffman 構建哈夫曼樹的過程 1.按照貪心演算法每次找權值最小 即值最小 的兩個數,構成孩子結點,並將這兩個資料排除出這一堆資料之外 2.由於哈弗曼樹的資料全在葉...

最優字首碼解析

給定字符集c x1,x2,xn 和每個字的頻率f xi 求關於c的乙個最優字首碼解析 哈夫曼演算法 根據哈夫曼樹求曼編碼表 int c,p char cd n 1 臨時存放編碼 int start 指示編碼在cd中的起始位置 cd n 0 編碼結束符 getchar for int i 0 i n ...