有篇文章(字串),想把它加密成01串。所以要給每個字元對映乙個01串代表它,而且乙個字元的01串不能是另乙個的字首,否則將出現二義性。所以可以把一顆二叉樹的葉子節點看成字元,向左走和向右走分別為0和1,這樣構造對映到的01串就不會有二義性,這個樹就是哈夫曼樹。為了使得01串總長度最小,就要構造最優哈夫曼樹。顯然每個字元的01串長度是字元節點的深度(到根節點經過的變數),所以使得len
=∑cn
ti∗d
eepi
,i∈σ
len=\sum,i\in\sigma
len=∑c
nti
∗dee
pi,
i∈σ最小。
其中c nt
i,de
epi,
σcnt_i,deep_i,\sigma
cnti,
deep
i,σ
分別表示字元i出現的次數,字元i的葉子結點深度,字元集合。以下n是字符集大小。
採用貪心演算法。一開始節點集合有n個字元節點,每個節點權為字元權重。每次選擇剩下的節點中選兩個權重最小的,合併成乙個新節點,權重為兩節點之和。刪除兩個節點,移入新節點。舊的兩個節點就是新節點的左右兒子。知道集合裡只有乙個節點。
每次集合減少乙個點,用優先佇列模擬選點過程的話,時間為t=∑
i=2n
log2
i+lo
g2(i
−1)=
o(nl
ogn)
t=\sum_^log_2i+log_2(i-1)=o(nlogn)
t=i=2∑
nlo
g2i
+log
2(i
−1)=
o(nl
ogn)
眾所周知,貪心演算法要滿足最優子結構和第一步正確性。
最優子結構:
這個比較好辦。現在是n個點,弄完第一步後剩n-1個點,要證明這n-1個點也得構成最優樹才能保證n個點也是最優樹。證明:
設n-1個點構成了t『樹,總長度為len』。此時n個點的樹的len
=len
『+cn
tx+c
nt
ylen=len『+cnt_x+cnt_y
len=le
n『+c
ntx
+cnt
y顯然len』最優才能保證len最優。
哈夫曼樹和哈夫曼演算法
1 最優二叉樹 具有最小加權路徑長度的二叉樹 2 哈夫曼演算法 由哈夫曼給出,用於構造最優二叉樹的演算法 3 哈夫曼樹 用哈夫曼演算法構造的最優二叉樹 4 哈夫曼演算法 很熟,所以就略了 5 函式createhfmtree的步驟 首先,構造n棵哈夫曼樹的物件,每棵樹只有乙個權值為w i 的根節點,且...
哈夫曼演算法
include include include include include 宣告兩種鍊錶結構 start struct node a typedef struct node a node,list list head null struct nodeb typedef struct nodeb ...
哈夫曼樹的構造演算法,哈夫曼編碼演算法
include define max 100 define maxvalue 500 typedef struct int weight int parent,lchild,rchild node 哈夫曼樹結點型別 以下部分定義哈夫曼編碼儲存結構 typedef structcodetype typ...