哈夫曼樹

1、樹的路徑長度算法

  • 兩個節點之間的路徑長度(PL)是鏈接兩節點的路徑上的分支數。如圖1中,節點七、8到29的PL都爲2,節點1五、14到29的PL都爲1.
  • 樹的外部路徑長度:各葉節點到根節點的路徑長度之和(EPL)。如圖1中,葉節點有七、八、14,分別到根節點的路徑爲二、二、1,那麼EPL爲5.
  • 樹的內部路徑長度:各非葉節點到根節點的路徑長度之和(IPL)。如圖1中,非葉節點有1五、29,分別到根節點的路徑爲一、0,那麼IPL爲1.
  • 樹的路徑長度:PL=EPL+IPL,則PL=5+1=6

圖1:           圖2:spa

n個節點的二叉樹的路徑長度不小於下述數列前n項之和(從根節點出發,從左到右編號),即blog

PL=Σi[log2i]=0+1+1+2+2+2+2+3+3+3+3+3+3+3+3+4+…([log2i]取整數)二叉樹

其路徑長度最小者爲 PL=Σi[log2i],只有徹底二叉樹知足纔要求PL=Σi[log2i]im

圖1爲徹底二叉樹,圖2不是徹底二叉樹,其PL 大於 Σi[log2i]。img

2、帶權路徑長度co

不少應用問題中爲樹的葉節點賦予一個權值,用於表示出現頻度、機率值等。所以,在問題處理中把葉節點定義得不一樣於非葉節點,把葉節點看做「外節點」,非葉節點看做「內節點」。這樣的二叉樹稱爲擴充二叉樹。ps

擴充二叉樹中只有度爲2的內節點和度爲0的外節點。根據徹底二叉樹的性質,有n個外節點就有n-1個內節點,總節點數爲2n-1.分支

若一顆擴充二叉樹有n個外節點,第i個外節點的權值爲wi,它到根的路徑長度爲li,則該外節點到根的帶權路徑長度爲wi*li

擴充二叉樹的帶權路徑長度:樹的各外節點到根的帶權路徑長度之和,即WPL=Σi(wi*li)

對於一樣的一組權值,放在外節點上,樹的組織方式不一樣,帶權路徑長度也不一樣。

如圖1:WPL=15*1+14*1+7*2+8*2,如何使得擴充二叉樹的帶權路徑長度最小,當權值大的值離根近,權值小的離根遠,則最小。

Huffman樹

在帶權路徑長度達到最小的擴充二叉樹即爲Huffman樹。在Huffman樹中,權值大的節點離根最近。

哈夫曼樹的構造算法:

1)由給定的n個權值{w0,w1,w2……wn-1},構造具備n顆擴充二叉樹的森林F={F0,F1,F2……Fn-1},其中每顆擴充二叉樹Ti只有一個帶權值wi的根節點,其左右子樹均爲空。

2)重複如下步驟,直到F中僅剩一顆樹爲止:

  • 在F中選取兩顆根節點的權值最小的擴充二叉樹,做爲左、右子樹構造一顆新的二叉樹。置新的二叉樹的根節點的權值爲其左、右子樹上根節點的權值之和。
  • 把F中刪去這兩顆二叉樹
  • 把新的二叉樹加入F
相關文章
相關標籤/搜索