哈夫曼樹的總結

2021-07-24 16:06:49 字數 1256 閱讀 1860

百科的定義:

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

根據以上可以知道,這個權值是起到了關鍵的作用,權值分布不同,構造出的最優二叉樹也是不同的。

帶權路徑長度就是指的所有葉節點的權值乘以路徑長度的總和。

當不考慮權值,或者說所有節點權值都一樣的時候,我們任意構造二叉樹,概率上來說其路徑之和都是一樣的。

當權值不同,我們就考慮,讓權值大的(也就是發生概率越大的)越靠近根節點,能夠更快地被檢測到,權值小的放地越遠離根節點,因為它被訪問的概率越小。

舉乙個例子,比如有乙個成績單:

接下來的問題是,如何構造哈夫曼樹?

一般可以按下面步驟構建:

1.將所有節點按權值大小從大到小進行排列,每個節點都可以當做一棵樹,則組成了乙個單節點森林。

2.在森林中選出兩棵根節點的權值最小的樹作為一棵新樹的左,右子樹,新樹根節點的權值為其左右子樹上節點的權值之和。為了使其為二叉查詢樹,應該令權值小的作為左兒子,權值大的作為右兒子。這裡有種特殊情況,即新樹的根的權值比較大,大於了其他節點的權值,那麼我們取得兩顆權值最小的樹中可能就不含有這棵新生成的樹。這對結果是沒有影響的,最終會生成一棵完整的哈夫曼樹。

3.從森林中刪除這兩棵樹,同時把新樹加入到森林中。

4.重複2,3步驟,直到最後森林中只剩一棵樹即哈夫曼樹。

下面是構建哈夫曼樹的**過程:

哈夫曼編碼

在對報文進行編碼時,可以使每個字元都有固定長度、固定結構進行編碼,然而這並不是最有效的編碼方式。

哈夫曼樹可以用來對報文進行編碼操作。

如果能統計出來報文裡每個字元出現的概率大小,那麼如若使出現概率大的字元編碼長度小一點,概率小的字元相對來說編碼長度大一點,那麼我們就達到了壓縮報文,節約空間的目的。

具體來說,哈夫曼編碼的過程就是,先按字元的權值大小,構造一棵哈夫曼樹,然後在樹中,每個節點的左兒子路徑表示為「0」,右路徑表示為「1」,則從根節點到每個葉子節點的路徑編碼,即可表示為相應字元的哈夫曼編碼。

就拿上圖例子來說:a,b,c,d對應的哈夫曼編碼分別為:111,10,110,0。

用圖說明則為:

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...