哈夫曼樹的基本概念
在介紹哈夫曼樹之前,先給出幾個基本概念。
1、結點間的路徑和路徑長度
(1)路徑是指從乙個結點到另乙個結點之間的分支序列。
(2)路徑長度是指從乙個結點到另乙個結點所經過的分支數目。
2、結點的權和帶權路徑長度
(1)在實際的應用中,人們常常給樹中的每個結點賦予乙個具有某種實際意義的實數,稱該實數為這個結點的權。
(2)在樹型結構中,我們把從根節點到某一結點的路徑長度與該結點的權的乘積,叫做該結點的帶權路徑長度。
3、樹的帶權路徑長度
樹的帶權路徑長度wpl為樹中從根節點到所有葉子結點的各個帶權路徑長度之和。樹的路徑長度pl。
研究樹的路徑長度pl和帶權路徑長度wpl,目的在於尋找最優分析。
問題1:什麼樣的二叉樹的路徑長度最小?
一棵樹的路徑長度為0的結點至多只有1個(根);路徑長度為1的結點至多只有2個(兩個孩子);……以此類推,路徑長度為k的 結點至多只有2^k個。所以n個結點的二叉樹的路徑長度至少等於如下圖所示序列的前n項之和。
由上圖可知,結點n對應的路徑長度為對對log2n向下取整。
完全二叉樹的路徑長度=2^0 * 0 + 2 ^(1) × 1 + …,所以完全二叉樹具有最小路徑長度的性質,但不具有惟一性。
有些二叉樹並不是完全二叉樹,但也可以具有最小路徑長度,如下圖所示。
問題2:什麼樣的二叉樹的帶權路徑長度最小?
例如,給定乙個權值序列,可構造如下圖所示的多種二叉樹的形態。
上圖(a)所示的二叉樹是完全二叉樹,但並不具有最小的帶權路徑長度,由此可見,完全二叉樹不一定帶權路徑長度最小。
那究竟什麼樣的二叉樹的帶權路徑長度最小?
給定n個實數w1,…,wn(n>=2),求乙個具有n個終端結點的二叉樹,使其帶權路徑長度最小。由於哈夫曼給出了構造這種樹的規律,將給定的結點構成一棵帶權路徑最小的二叉樹,因此就稱為哈夫曼樹。
構造哈夫曼樹的演算法(這種生成演算法就是一種典型的貪心法)步驟如下:
(1)初始化:用給定的n個權值對應由n棵二叉樹構成的森林f=,其中每一棵二叉樹ti都只有乙個權值為wi的根 結點。
(2)找最小樹:在森林f中選擇兩棵根結點權值最小的二叉樹,作為一棵新二叉樹的左、右子樹,標記新二叉樹的根結點權值為其左、右子樹根結點的權值之和。其中權值可以相同。
(3)刪除與加入:從f中刪除被選中的那兩棵二叉樹,同時把新構成的二叉樹加入到森林中。
(4)判斷:重複(2)、(3)操作,直到森林中只含有一棵二叉樹為止,此時得的這棵二叉樹就是哈夫曼樹。
哈夫曼樹是求某種最優方案。
由於哈夫曼樹沒有度為1的結點,因此一棵有n個葉子結點的哈夫曼樹共有2n-1個結點。
哈夫曼樹是正則二叉樹(也叫正規二叉樹),即其中只有度為0和度為2的結點,又因為對任意一棵二叉樹n0 = n2+1,而此時的n = n0+n2,所以n = 2 * n0 - 1。
哈夫曼編碼
用電子方式處理符號時,需先對符號進行二進位制編碼。例如,在計算機中使用的英文本元的ascii編碼就是8位二進位制編碼,ascii編碼是一種定長編碼,即每個字元用相同數目的二進位制位編碼。
為了縮短資料檔案長度,可採用不定長編碼。其基本思想是,給使用頻度較高的字元編以較短的編碼。這是資料壓縮技術的最基本思想。
如何給資料檔案中的字元編以不定長編碼,使資料檔案的長度最短呢?這是乙個與哈夫曼樹相關的最優問題。
在設計變長編碼的時候需注意,這種編碼必須要滿足這樣乙個條件:任乙個編碼不能是其他編碼的字首。把滿足這個條件的編碼叫做字首編碼。
(1)字首編碼:如果在乙個編碼系統中,任乙個編碼都不是其他任何編碼的字首(最左字串),則稱該編碼系統中的編碼是字首編碼。
例如,一組編碼01,001,010,100,110就不是字首編碼,因為01是010的字首,若去掉01或010就是字首編碼。
(2)哈夫曼編碼:對一棵具有n個葉子的哈夫曼樹,若對樹中的每個左分支賦予0,右分支賦予1,則從根到每個葉子的通路上,各分支的賦值分別構成乙個二進位制串,該二進位制串就稱為哈夫曼編碼。
哈夫曼編碼的相關特性
定理1:哈夫曼編碼是字首編編碼。
定理2:哈夫曼編碼是最優字首編碼。即對與n種字元,分別以它們的使用頻度為葉子權構造哈夫曼樹,則該樹對應的哈夫曼編碼能使由這
n種字元構成的檔案對應的二進位制串的長度最短。
哈夫曼編碼的平均碼長為:每種編碼的長度×該編碼的使用頻度。
huffman樹(最優二叉樹 和huffman編碼
在許多實際應用中,數中結點常常被賦予乙個表示某種意義的數值,稱為該結點的權。從樹根結點到任意結點的路徑長度 經過的邊數 與該結點上權值的乘積稱為該結點的帶權路徑長度。數中所有葉結點的帶權路徑長度之和稱為該樹的帶權路徑長度 特點 1.每個初始結點最終都成為葉結點,且權值越小的結點到根節點的路徑長度越大...
二叉樹之 線索二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊 對於n個結...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...