(一)基本介紹
1)給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做「最優二叉樹」,也叫「赫夫曼樹」
帶權路徑最短=最優二叉樹=赫夫曼樹
2)赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近
(二)重要概念
(三)赫夫曼樹建立思路
乙個數列,要求轉成一顆赫夫曼樹
1)從小到大進行排序,每乙個資料都是乙個節點,每個節點可以看成是一顆最簡單的二叉樹——
2)取出根節點權值最小的兩顆二叉樹——取出
3)組成一顆新的二叉樹,這個新的二叉樹的根節點的權值是前面兩顆二叉樹根節點權值的和——1+3=4,新樹根節點為4,子節點為1,3
4)再把這個新的二叉樹,根據根節點的權值大小再次排序,不斷重複1-2-3-4的步驟
直到數列中,所有的資料都被處理,就得到一顆赫夫曼樹——然後,選出,根節點為10,繼續
(四)赫夫曼編碼
1)是一種編碼方式,屬於一種程式演算法
2)赫夫曼編碼是赫夫曼樹的一種應用,主要應用在電訊通訊中
3)赫夫曼編碼廣泛的用於資料檔案壓縮,壓縮率通常在20%~90%之間
4)赫夫曼碼是「可變字長編碼」的一種,稱為最佳編碼
(五)赫夫曼編碼原理剖析
在通訊領域裡資訊的處理方式1-定長編碼
1)乙個字串,共40個字串(包括空格)
2)先轉換成對應的ascii碼
3)再把ascii碼轉換成對應的二進位制
4)按照二進位制來傳遞資訊,總的長度是359(包括空格)
編碼過程:
1)首先給個字串
2)統計各個字元出現的次數
3)根據字元出現的次數構件一棵赫夫曼樹,次數作為權值
4)根據赫夫曼樹,給各個字元規定編碼(字首編碼),向左的路徑為0,向右的路徑為1
這樣赫夫曼樹里的每乙個字元都有自己獨有的乙個編碼
5)按照上面的赫夫曼編碼,字串的字元就可以替換成編碼
注意:這個赫夫曼樹根據排序方法不同,也可能不太一樣,這樣對應的赫夫曼編碼也不完全一樣,但是wpl是一樣,都是最小的,
比如:如果我們讓每次生成的新的二叉樹總是排的權值相同的二叉樹的最後乙個,則生成的二叉樹
通訊領域中資訊的處理方式2-變長編碼
1)乙個字串,共40字元(包括空格)
2)各個字元對應的出現的個數
3)按照各個字元出現的次數進行編碼,原則是出現次數越多的,則編碼越小,比如空格出現出現了9次,編碼為0,其他依次類推
4)按照上面給各個字元規定的編碼,把字串改寫成上面的編碼
5)字元的編碼都不能是其他字元編碼的字首,符合此要求的編碼叫做字首編碼,即不能匹配到重複的編碼(這個赫夫曼編碼中)
通訊領域中資訊的處理方式3-赫夫曼編碼
思路:1)node節點類,data放資料,weight放權值,left和right指標
2)得到字串對應的byte陣列
3)編寫乙個方法,把準備構件赫夫曼樹的node節點放到list
4)通過list建立對應的赫夫曼樹
//首先建立節點
//為了讓node物件持續排序collections集合排序,讓node實現comparable
class
node
implements
comparable
if(this
.right != null)
}public
node
(int value)
@override
public string tostring()
';}@override
public
intcompareto
(node node)
}
public
class
huffmantree
;//測試生成一棵赫夫曼樹,獲取樹的根節點
node root=
createhuffmantree
(arr)
;//測試前序遍歷赫夫曼樹
preorder
(root);//
}//編寫乙個前序遍歷的方法
public
static
void
preorder
(node root)
else
}//建立赫夫曼的方法
public
static node createhuffmantree
(int
arr)
//迴圈建立
while
(nodes.
size()
>1)
return nodes.
get(0)
;}}
資料結構 赫夫曼樹
赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...
資料結構 赫夫曼樹
赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...
資料結構之赫夫曼樹
每個結點應該包含的資訊有 字元內容 父結點和左右孩子結點的下標 權重以及該字元的編碼。struct hfnode class huffmantree void selectmin int len,int s1,int s2 else if ht i weight min2 void createhf...