演算法分析與設計 作業11 最優字首碼

2021-10-06 02:06:29 字數 1177 閱讀 7505

**(碼字):q表示字元a,b,c,d

同一序列:0100001

產生兩種解碼(產生歧義):01 00 001;010 00 01

二元字首碼:任何字元的**不能作為其他字元**的字首

利用二元字首碼解碼:從第乙個字元開始依次讀入每個字元(0或1),如果發現讀到的字串與某個碼字相等,就將這個子串譯作對應的碼字;然後從下乙個字元開始繼續這個個過程,直到讀完輸入的字串為止。

二元字首編碼儲存:二叉樹結構,每個字元作為樹葉,對應這個字元的字首碼看作根到這片樹葉的一條路徑,每個結點通向左兒子的邊記作0,通向右兒子的邊記作1。

字元集合c=

xi的頻率是f(xi)

d(xi)表示字元xi二進位制位數,也就是xi的碼長

二元字首編碼:二叉樹

碼字:樹葉

碼字的二進位制位數:樹葉的深度

儲存乙個字元所使用的二進位制數的平均值

b=∑(i=1,n)f(xi)d(xi)

最優二元字首碼:每個碼字平均使用二進位制位數最小的字首碼,稱為二元最優字首碼。

問題:給定字符集c=和每個字元的頻率f(xi),求關於c的乙個最優字首碼。

構造最優字首碼的貪心演算法就是哈夫曼演算法

例項:

演算法 huffman

(c)輸入:c=,f

(xi)

,i=1,2

,...

,n輸出:q//佇列

n←|c|

q←c//頻率遞增佇列q

for i←1 to n-1do

z←allocate-

node()

//生成結點

z.left←q中最小元//最小作z左兒子

z.right←q中最小元//最小作z右兒子

f(z)←f

(x)+

f(y)

insert

(q,z)

//將z插入q

return q

o(nlogn)頻率排序;for迴圈o(n),插入操作o(logn),演算法時間複雜度是o(nlogn)

演算法分析與設計11最優字首碼

給定字符集c 和每個字元的頻率f xi 求關於c的乙個最優字首碼 構造最優字首碼的貪心演算法就是哈夫曼演算法。將字符集作為森林,從中選出頻率最低的兩個字元,將這兩個字元的合併成一棵新樹,新樹的根節點權值為兩字元頻率之和,從森林中刪除這兩個字元,將新樹加入森林,重複直至全部合併為一顆樹,即為所求的哈夫...

作業11 最優字首碼

問題 給定字符集 c 和每個字元的頻率f xi 求關於 c 的乙個最優字首碼。構造最優字首碼的貪心演算法就是哈夫曼演算法 huffman 哈夫曼樹的基本思想 選擇權值小的葉子離根距離遠些。實現 第一步 以每個結點作為根,構造只有乙個根結點的n棵二叉樹,根的權值就是結點的權。第二步 在所有二叉樹中選擇...

作業11 最優字首碼

哈夫曼編碼 兩個結構體,a用來儲存樹節點 b儲存節點鍊錶 輸入資料儲存到a結構體指標陣列,隨後按照權值排序 1 將陣列中的指標插入到b結構體組成的鍊錶中 2 取煉表前兩個節點的a元素,合併成新的乙個b,構成乙個新的b節點c,將c公升序插入到鍊錶中 3 煉表頭結點右移兩位 重複1,2,3操作直到鍊錶中...