哈夫曼編碼就是利用哈夫曼樹構造的最優編碼。
基本思想是:為出現次數較多的字元編以較短的編碼。
對於每個字元,根據其出現的次數為權值,構造哈夫曼樹。然後從根到每個葉子節點的路徑上,左分支賦值0,右分支賦值1,個分支構成乙個二進位制串,這個二進位制串就是哈夫曼編碼。
#include
#include
#include
using
namespace
std;
//哈夫曼樹的儲存表示
typedef
struct
htnode, *huffmantree;
// 哈夫曼編碼表的儲存表示
typedef
struct
huffmancode;
// 選擇權值最小的兩顆樹
void selectmin(huffmantree ht, int n, int &s1, int &s2)
else}}
if(ht[s1].weight > ht[s2].weight)
for(i += 1; i < n; ++ i)else
if(ht[i].weight < ht[s2].weight)}}
}// 構造有n個權值(葉子節點)的哈夫曼樹
void createhufmantree(huffmantree &ht)
for(int i = 1; i <= n; ++ i)
ht[0].weight = m; // 用0號節點儲存節點數量
/****** 初始化完畢, 建立哈夫曼樹 ******/
for(int i = n + 1; i <= m; ++ i)
}// 構造根據哈夫曼樹來哈夫曼編碼
void createhuffmancode(huffmantree ht, huffmancode &hc)
else
child = parent;
parent = ht[parent].parent;
}cd[len] = 0;
reverse(cd, cd + len); // 將序列翻轉
hc.code[i] = new
char[len];
strcpy(hc.code[i], cd);
}delete cd;
}// 輸出哈夫曼表
void printhuffmancode(huffmancode &hc)
}// 銷毀哈夫曼樹
void destoryhuffmantree(huffmantree &ht)
// 銷毀哈夫曼編碼表
void destoryhuffmancode(huffmancode &hc)
delete hc.code;
hc.code = null;
}int main()
對於串「abcdabcdaaaaabbbdd
」,
a、b、c、d出現的次數分別為7、5、2、4,構造的編碼表為:
ps:更完整的解碼編碼可以參考:
哈夫曼編碼演算法實現
哈夫曼編碼實現huffmantree.c include include includetypedef struct htnode,huffmantree 動態分配陣列儲存哈夫曼樹 typedef char huffmancode 動態分配陣列儲存哈夫曼編碼 void select huffmant...
哈夫曼樹及其編碼
include include include includeusing namespace std define ok 1 define error 0 define true 1 define false 0 typedef int status 定義哈夫曼樹結點 typedef struct ...
哈夫曼樹及其編碼
首先是哈夫曼樹的定義 在一棵二叉樹中,帶權路徑長度達到最小,成這樣的樹是最優二叉樹,也是哈弗曼樹。大概意思就是把數值大的節點放在樹上面,數值小的節點放在樹下面。哈夫曼樹的結構使用順序結構,這裡直接使用了陣列。建造哈弗曼樹的思路 根據二叉樹的性質,有n個葉子節點,二叉樹就會有2n 1個節點。定義乙個陣...