哈夫曼演算法和它的嚴格證明

2021-10-06 05:06:18 字數 1188 閱讀 7911

有篇文章(字串),想把它加密成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∑

n​lo

g2​i

+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...