資料結構與演算法 赫夫曼樹

2021-10-08 02:43:41 字數 1542 閱讀 1576

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度(wpl)達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree), 還有的書翻譯為霍夫曼樹。

赫夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。

通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l-1。

若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。

結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。

樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為wpl(weighted path length) ,權值越大的結點離根結點越近的二叉樹才是最優二叉樹

構建赫夫曼樹的步驟:

①從小到大進行排序, 將每乙個資料,每個資料都是乙個節點 , 每個節點可以看成是一顆最簡單的二叉樹;

②取出根節點權值最小的兩顆二叉樹 ;

③組成一顆新的二叉樹, 該新的二叉樹的根節點的權值是前面兩顆二叉樹根節點權值的和 ;

④再將這顆新的二叉樹,以根節點的權值大小和其餘節點再次排序, 不斷重複 1-2-3-4 的步驟,直到數列中,所有的資料都被處理,就得到一顆赫夫曼樹。

// 建立結點類

// 為了讓node 物件持續排序collections集合排序

// 讓node 實現comparable介面

class node implements comparable

if(this.right != null) }

public node(int value)

@override

public string tostring()

@override

public int compareto(node o)

}

// 建立赫夫曼樹的方法

/***

* @param arr 需要建立成哈夫曼樹的陣列

* @return 建立好後的赫夫曼樹的root結點

*/public static node createhuffmantree(int arr)

//我們處理的過程是乙個迴圈的過程

while(nodes.size() > 1)

//返回哈夫曼樹的root結點

return nodes.get(0);

}

赫夫曼編碼也翻譯為哈夫曼編碼(huffman coding),又稱霍夫曼編碼,是一種編碼方式, 屬於一種程式演算法,赫夫曼編碼是赫哈夫曼樹在電訊通訊中的經典的應用之一。

赫夫曼編碼廣泛地用於資料檔案壓縮。其壓縮率通常在20%~90%之間。赫夫曼碼是可變字長編碼(vlc)的一種。huffman於2023年提出一種編碼方法,稱之為最佳編碼。

資料結構 赫夫曼樹

赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...

資料結構 赫夫曼樹

赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...

資料結構(八) 赫夫曼樹

一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...