給定字符集c=和每個字元的頻率f(xi),求關於c的乙個最優字首碼。
構造最優字首碼的貪心演算法就是哈夫曼演算法(huffman)
舉例
規則是:依次讀人檔案的二進位製碼,從哈夫曼樹的根結點出發,若當前讀入0,則走向左孩子,否則走向右孩子。
時間複雜度o(n)=#include
#include
#include
#include
using namespace std;
#define n 8
//葉子數目
#define m 2*n-1
//樹中結點總數
typedef
struct
htnode;
typedef htnode huffmantree[m]
;//huffmantree是向量型別
typedef
struct
temp;
typedef
struct
codenode;
typedef codenode huffmancode[n]
;//初始化哈夫曼樹
void
inithuffmantree
(huffmantree t)
}//輸入葉子權值
void
inputweight
(huffmantree t)
}//用於排序的比較函式
bool cmp
(temp a, temp b)
//在前k個結點中選擇權值最小和次小的根結點,其序號分別為p1和p2
void
selectmin
(huffmantree t,
int k,
int* p1,
int* p2)
}sort
(x, x + j, cmp)
;//對x按照權值從小到大排序
//排序後的x向量的第一和第二個位置中儲存的id是所找的根節點的序號值
*p1 = x[0]
.id;
*p2 = x[1]
.id;
}//根據哈夫曼樹t求哈夫曼編碼表h
void
charsethuffmanencoding
(huffmantree t, huffmancode h)
strcpy_s
(h[i]
.bits,
&cd[start]);
//複製編碼位串}}
void
createhuffmantree
(huffmantree t)
}int
main()
printf
("平均碼長為:%.2lf\n"
, wpl)
;return0;
}
哈夫曼編碼最優字首碼的貪心演算法
哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效的編碼方法。其壓縮率通常在20 90 之間。哈夫曼編碼演算法用字元在檔案 現的頻率表來建立乙個用0,1串表示各字元的最優表示方式。字首碼 對每乙個字元規定乙個0,1串作為其 並要求任一字元的 都不是其他字元 的字首。這種編碼稱為字首碼。編碼的字首性質可以使...
貪心演算法 最優裝載
貪心演算法思想 不從整體最優上加以考慮,它所做出的選擇只是在某種意義上的區域性最優選擇,當然希望貪心演算法得到的最終結果也是整體最優的 貪心演算法性質 指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到 1 問題描述 有一批貨櫃要裝上一艘載重量為 tatol 的輪船,其中貨櫃 i...
二元最佳字首碼 貪心 最優字首碼
二元字首碼 任何字元的 不能作為其它字元 的字首.eg.q 不是二元字首 如序列0100001會產生歧義 設c 是n個字元的集合,f xi 為xi出現的頻率,d xi 為xi的碼長,i 1,2,n.儲存乙個字元的平均二進位制位數 碼數 b sum limits f x i d x i 每個二元字首碼...