2010-06-08 72 views
7

A quick tutorial on generating a huffman tree霍夫曼樹混淆

混淆霍夫曼樹。在上面的鏈接末尾,它顯示了剩下2個元素的樹,然後顯示了完成的樹。我對它分支的方式感到困惑。 Huffman樹需要分支的具體方法是什麼?

例如,57:*與其右側的孩子35:*分支到右側。它是否已經35分支到左邊,22分支到右邊?另外,爲什麼不是22:*與15:4配對 - 它與20:5配對創建一棵新樹。

從最初的obersvations看來,樹不需要被平衡或者沒有任何特定的順序,除了葉子的頻率加起來到父節點的值。創建具有相同數據的哈夫曼樹的兩個人最終會得到不同的編碼值嗎?

回答

4

到哈夫曼樹的關鍵是這樣的:

排序這個列表中的頻率,使兩個最低的元素到葉

如果你有一個有兩個以上的元素最低頻率(例如3,4,4 ...),任何兩個都會(3和4s中的任一個 - 而不是兩個4s)。而且,這些最低元素中的哪一個被賦值爲0,哪一個是1,這並不重要。這兩個事實允許從相同的數據產生不同但有效的霍夫曼編碼。

霍夫曼樹應該被頻率平衡,而不是節點的數量。因此,下面是平衡的:

(100 (50 (25 (12 (12 1))))) 

,這是不是:

(((100 50) 25) ((12 12) 1))) 
在你的問題

具體來說,15搭配20而不是22,因爲15和20兩個最低剩餘值(包括低於22)。無論是分支(左邊還是右邊)都可以,只要它是一致的(在相同的算法中總是較小的左邊或總是較小的右邊,以便在另一端重建編碼)。

+3

海報注意:請注意,這些決定不會改變您的霍夫曼編碼壓縮數據的效果。無論您如何安排葉子,每次樹中的所有值都會處於相同的深度,這意味着代碼的長度將始終按值的頻率排序。 – mquander 2010-06-08 01:25:40

+0

@mquander:不能說更好的我自己。 – Amadan 2010-06-08 01:27:58

+0

謝謝。它現在是有道理:) – ShrimpCrackers 2010-06-08 01:46:11

2

一切都在頁面上解釋。 22:*與15:4不搭配,因爲在每一步中,具有最低元素的兩個節點組合在一起。這創建了一個獨特的順序。

霍夫曼編碼可以不同(如果你有多個值相同的頻率或交換0和1表示左/右),但霍夫曼長度不能。

分支左/右只是如何畫樹或表示圖形的問題,所以這並不重要。

6

到目前爲止發佈的帖子是錯誤的和誤導性的:選擇等重的葉片確實是的問題,它們確實會改變它們壓縮數據的效果。

以下是一個演示如何選擇不同導致不同的壓縮率的計數器例如: ABBBCCCDDDDEEEEEEEE

答:1,B:3,C:3,d 4,E:8。 第一步:以A和B組成一個重量爲4的節點。 第二步:

如果你在第一步中用C創建了新創建的節點,那麼你得到了 (19 (11 (7 (4 (1-A) (3-B)) (3-C)) (4-D)) (8-E)),它給出了37位壓縮數據。

另一方面,如果您取D(也是權重爲4)而不是新創建的節點,則會得到給出41位壓縮數據的 (19 (11 (4 (1-A) (3-B)) (7 (3-C) (4-D))) (8-E))

+1

那麼如何解決這個問題。我有我的壓縮機重建與解壓縮器不同的表格。我怎樣才能區分節點。 – 2014-03-12 15:28:13

+0

除非你的霍夫曼算法是確定性的,否則你將不得不將內置的霍夫曼樹集成到文件中。 – kyrias 2016-07-27 18:00:34