赫夫曼樹 樹

2021-07-13 10:09:38 字數 1403 閱讀 6148

在資料膨脹,資訊**的今天,資料壓縮的意義不言而喻。談到資料壓縮,就不能 不提赫夫曼編碼,赫夫曼編碼是首個使用的壓縮編碼方案,即使在今天的知名壓縮演算法裡,依然可以見到赫夫曼編碼的影子。

另外,在資料通訊中,用二進位製給每個字元進行編碼時不得不面對乙個問題是如何使電文總長最短且不產生二義性。根據字元出現頻率,利用赫夫曼編碼可以構造出一種不等長的二進位制,使編碼後的電文長度最短,且保證不產生二義性。

介紹赫夫曼編碼前,我們先介紹赫夫曼樹。先看乙個例子:

以下程式在效率上有什麼問題呢?

**畫成流程圖 和樹比較像

看著好像沒問題,但是實際情況是在70-89之間的佔乙個班的70%人數,如果按照上面的**來判斷,效率是低下的,如果改進一下是不是會快點,如下

這樣效率會極大的提公升,這也就是赫夫曼樹的基本原理。

赫夫曼樹的定義與原理

我們先把這兩棵樹二叉樹簡化成葉子節點帶權的二叉樹(注;樹節點間的連線相關的數叫做權,weight)

結點的路徑長度

-從根結點到該結點的路徑上的連線數。例如c就是3,

樹的路徑長度

-樹種每個葉子結點的路徑長度之和。

結點帶權路徑長度

-結點的路徑 長度與結點權值的乘積。

樹的帶權路徑長度

-wpl是樹中所有葉子結點的帶權路徑長度之和。

上圖中左邊流程圖的wpl是275,右邊的是10x1+70x2+15x3+5x3 = 210,很明顯右邊效率更優。

wpl的值越小,說明構造出來的二叉樹效能越優,那麼如何構造呢?

初始化一棵樹的結點為:

步驟:1.在森林中選出兩棵 根結點的權值最小的二叉樹,小的放左邊,大的放右邊。

2.合併兩個選出的二叉樹,增加乙個新結點作為新二叉樹的根,權值為左右孩子的權值之和。

3.然後在森林中選出一棵根結點權值最小的二叉樹,如果比剛才的新二叉樹的根節點大,放在新二叉樹的右邊,否則左邊,

4.再次執行第二步。

這樣就構成了最優二叉樹,也就是赫夫曼樹。

樹 赫夫曼樹

幾個概念 wpl最小的就是赫夫曼樹 赫夫曼樹的建立 將數列 轉成一顆赫夫曼樹的過程 將數列元素從小到大排序 取出最小的兩個元素,生成一棵新的二叉樹,取出的兩個元素作為新二叉樹的子節點 一般權重小的作為子節點 根節點的權重為子節點權重之和 將處理過的兩個元素從列表中刪除,將新的根節點加入列表 重複1 ...

哈夫曼樹,赫夫曼樹

參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...

樹5 赫夫曼樹

這個程式包括 通過輸入建立赫夫曼樹 哈夫曼樹 輸入一串字串,能得到其赫夫曼編碼,輸入一串赫夫曼編碼,也能得到其原始字串,有能實現這兩個功能的兩個函式 思路是下面這個博主的,在此表示感謝 noj 哈夫曼編 解碼器 原題目 不過為了以後複習時看得懂,我修改了輸入方式 不過由於中間步驟不同,最後輸出的編碼...