哈夫曼樹構造演算法的正確性證明

2021-09-03 10:24:12 字數 949 閱讀 3357

哈夫曼樹構造

1.哈夫曼樹的定義

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。

2.哈夫曼樹的構造

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1,w2,…,wn,則哈夫曼樹的構造規則為:

(1) 將w1,w2,…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼樹。

下面給出哈夫曼樹的構造過程,假設給定的葉子結點的權分別為1,5,7,3,則構造哈夫曼樹過程如圖所示。 從圖中可知,n 個權值構造哈夫曼樹需n-1次合併,每次合併,森林中的樹數目減1,最後森林中只剩下一棵樹,即為我們求得的哈夫曼樹。

哈夫曼構造正確性證明。

如上圖,wpl值為3×(1+3)+2×5+1×7=29.

事實上wpl值也是所有非葉子節點的和,即4+9+16=29.

這是可以證明的。

從最底層開始計算,最底層的2個葉節點的根結點的值為葉節點的和,每個根結點都為葉節點的和,也就是說,每個非葉節點的值都是它底下所有的葉節點的和。比如16=1+3+5+7,9=1+3+5。因此把4,9,16這些節點加起來,就相當於底層節點1,3加了3遍,5加了2遍,7加了1遍。即每個值加的遍數就是該值的深度。

又因為根據演算法,n個葉子節點所組成的乙個集合,每次取走2個最小節點,再加入乙個節點,直到只剩下最後乙個節點。因此,新生成的葉子非葉子節點個數必定是n-1個。因此要保證wpl值最小,也就是保證生產的非葉子節點和最小,即生成的節點和值最小。因此每次生成的節點取最小值,即可保證,總的和值是最小的。即wpl值也是最小的。

哈夫曼樹構造演算法的正確性證明

哈夫曼樹構造 1 哈夫曼樹的定義 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 2 哈夫曼樹的構造 假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。n個權值分別設為 w1,w2,wn,則哈夫曼樹的構造規則...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...