作業11 最優字首碼

2021-10-07 05:38:13 字數 775 閱讀 5701

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

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

哈夫曼樹的基本思想:選擇權值小的葉子離根距離遠些。

實現:第一步:以每個結點作為根,構造只有乙個根結點的n棵二叉樹,根的權值就是結點的權。

第二步:在所有二叉樹中選擇根的權值最小的兩棵二叉樹作為左右子樹構造一棵新的二叉樹,根的權值等於其左右子樹的根的權值之和。

第三步:去掉選中的二叉樹、加入新生成的二叉樹。

第四步:重複2、3步,直至只剩下一棵樹為止。

//構造哈夫曼樹

hftree create_hftree

(int

* w,

int n)

for(

; i < total; i++

)int min1, min2;

//用於儲存每次迴圈選出的兩個weight最小且parent為0的節點

for(i = n; i < total; i++

)return ht;

}

o(nlogn)頻率排序;for 迴圈 o(n),插入操作 o(logn)

演算法時間複雜度是 o(n logn)

作業11 最優字首碼

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

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

碼字 q表示字元a,b,c,d 同一序列 0100001 產生兩種解碼 產生歧義 01 00 001 010 00 01 二元字首碼 任何字元的 不能作為其他字元 的字首 利用二元字首碼解碼 從第乙個字元開始依次讀入每個字元 0或1 如果發現讀到的字串與某個碼字相等,就將這個子串譯作對應的碼字 然後...

最優字首碼問題

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