哈弗曼編碼可以用於檔案無失真壓縮
哈弗曼所生產的的編碼是字首碼即沒有任何碼字是其他碼子的字首(詞句出於演算法導論),需要字首碼是因為他的無歧義性質。
構造字首編碼的過程相當於構造一顆滿二叉樹(full binary tree)注意不是平衡二叉樹(bbt),而哈夫曼的樹又是最優二叉樹,
如果已知葉子節點數為:nl 那總共的節點為nt=nl*2-1
當已經統計好內容頻率後,每一次向上構造樹幹都需要用到當時最小的和次小的樹葉頻率或者說是重量,
找出最小和次小的結點,可以用比較在都沒有父母的孩子(樹葉)的前提下,從而找出孩子的數量是最小的和次小的2個結點
也可以用優先佇列(build_min_heap)來實現 。
先無頭無腦的就說這麼多,以後再細細補充w
以下是**(**用的是比較都沒有的父母的樹葉來找最小和次小)
#include#define leaf 4 //我偷懶了,這假設葉子樹數也就是字元統計數為已知
#define max 1000
typedef struct huffmannodehn;
typedef struct huffmancodehc;
hn hn[leaf * 2 - 1];
hc hc[leaf];
void initnode(int a){
int i = 0;
for (i = 0; i < leaf * 2 - 1; i++){
if (i
例子輸出:
哈弗曼編碼 哈弗曼樹
哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...
哈弗曼樹與哈弗曼編碼(實現)
歷史背景 1951年,霍夫曼在mit攻讀博士學位,他和修讀資訊理論課程的同學得選擇是完成學期報告還是期末考試。導師robert fano出的學期報告題目是 查詢最有效的二進位制編碼。由於無法證明哪個已有編碼是最有效的,霍夫曼放棄對已有編碼的研究,轉向新的探索,最終發現了基於有序頻率二叉樹編碼的想法,...
哈弗曼 筆試
哈弗曼編碼幾乎是所有壓縮演算法的基礎,其實這個演算法並不複雜,簡單的理解就是,如何用更短的bit來編碼資料。我們知道普通的編碼都是定長的,比如常用的ascii編碼,每個字元都是8個bit 字元 編碼 a00101001 b00101010 c00101011 這樣,計算機就能很方便的把由0和1組成的...