2012-08-14 81 views
3

我瞭解如何創建哈夫曼樹,當頻率彼此不同時,但如果少數頻率相同,我將如何繪製該哈夫曼樹:如何生成這個霍夫曼樹(類似於二叉樹)

的哈夫曼樹的簡單解釋是發現here

的哈夫曼樹的數據,我想創建:

Letter Frequency 
A  15% 
B  15% 
C  10% 
D  10% 
E  30% 
F  20% 

現在,我開始與這對信兩個最低頻率和D

. 
/\ 
C D 

但是下一步會是什麼?因爲我們有AB具有相同的頻率,所以我們選擇哪一個?如果我們選擇其中之一,那麼當選擇第二個時,結構將如何顯示?

如果讓我選擇B那麼它會是這樣的(除非我是錯的)

 . 
    /\ 
    B . 
    /\ 
    C D 

那這一步之後???

這些可以使用Java和C進行編碼,我試圖在實現它們之前先弄清楚它們是如何工作的。

編輯

我的樹是這個樣子:

  ___________|_________________ 
     /\       | 
    /\       | 
     F E       | 
    /\        | 
    / \        | 
    B  A       /\ 
            /\ 
            C D 

也得到了從網上

enter image description here

+0

你總是選擇兩個最低的頻率,所以你的第二步是錯誤的。您不會選擇CD和B(分別爲20%和15%) - 您選擇A和B(15%和15%)。對於這組特定的頻率,在選擇最低的兩個頻率時絕不會含糊不清。但是,這可能會發生。您可以使用具有不同拓撲結構的多個不同樹的頻率集。但是,它們都具有完全相同的應用頻率的平均位數,並且都是最優的。 – 2012-08-14 15:23:32

回答

3

步驟一步回答你的問題。

所以,你開始

A = 15% 
B = 15% 
C = 10% * 
D = 10% * 
E = 30% 
F = 20% 

你挑兩個最低(C + d),並加入他們(它們的總和爲20

20 
/\ 
C D 

你現在有

A = 15% * 
B = 15% * 
C+D = 20% 
E = 30% 
F = 20% 

現在你加入另外兩個最低(A,B),其總和爲30.

 20  30 
    /\ /\ 
    C D A B 

你現在有

A+B = 30% 
C+D = 20% * 
E = 30% 
F = 20% * 

最低的是(C + d,F),讓你加入他們的行列

40 
/\  
    F 20  30 
    /\ /\ 
    C D A B 


A+B = 30% * 
C+D+F = 40% 
E = 30% * 

下一步,和以前一樣:

A+B+E = 60% * 
C+D+F = 40% * 


     100 
    / \ 
    40  60 
/\ /\ 
    F 20 E 30 
    /\  /\ 
    C D  A B 
+0

以上是正確的。 – 2012-08-14 18:18:23

1

它並不真正無論您選擇爲例,你會得到一些不同的編碼,但是具有相同的概率。在某些情況下,有更多可能的方式來構建樹,但這並不重要。

我已經編輯了圖像,因爲我犯了一個錯誤,但請檢查我的第二個答案是否正確。

+0

另一個答案是不同於你的......哪一個是正確的哈哈 – 2012-08-14 11:00:46

+0

我很確定這一個是正確的。我在uni +考試中有過,除非我犯了一個愚蠢的錯誤(但我檢查過),但是我創建它的方式是正確的。如果你按照拉約斯阿帕德的方式,你總會以這樣一棵深深的樹結束,我認爲這是不正確的。 – KadekM 2012-08-14 11:02:44

+0

他的人看起來與我的看法截然不同,包括我繪製的樹 – 2012-08-14 11:10:20

2

你將會得到一些代碼來處理任何平等的分歧。

|  letter  | A | B | C | D | E | F | 
|-----------------|-----|-----|-----|-----|-----|-----| 
|  freq  | 10 | 20 | 30 | 5 | 25 | 10 | 
|-----------------|-----|-----|-----|-----|-----|-----| 

按最大

|-----------------|-----|-----|-----|-----|-----|-----| 
|  letter  | C | E | B | F | A | D | 
|-----------------|-----|-----|-----|-----|-----|-----| 
|  freq  | 30 | 25 | 20 | 10 | 10 | 5 | 
|-----------------|-----|-----|-----|-----|-----|-----| 

tree creating

freq   30 10  5  10  20  25 
symbol   C  A  D  F  B  E 
         |  | 
         |--|--| 
         ||-| 
         |15| = 5 + 10 

2 step

freq   30 10  5  10  20  25 
symbol   C  A  D  F  B  E 
        |  |  | 
        |  |  | 
        | |--||  | 
        |-|15||  | 
         ||-|  | 
         |   | 
         | |--| | 
         |----|25|-| = 10 + 15 
          |--| 

3 step

freq   30 10  5  10  20  25 
sym   C  A  D  F  B  E 
      |  |  |  |  |  | 
      |  |  |  |  |  | 
      |  | |--||  |  |  | 
      |  |-|15||  |  |  | 
      |  ||-|  |  |  | 
      |  |   |  |  | 
      |  | |--| |  | |--| | 
      |  |----|25|-|  |-|45|-| 
      |    ||-|   ||-| 
      | |--|  |    | 
      |----|55|------|    | 
        |-||     | 
        | |------------| | 
        |---| Root (100) |----| 
         |------------| 

編碼:

C = 00 
    A = 0100 
    D = 0101 
    F = 011 
    B = 10 
    E = 11 
+0

asci圖表,可愛:) – bestsss 2012-08-14 11:05:28

+0

我明白步驟1和2,但不明白你爲第3步做了什麼。你爲什麼包括B和E作爲單獨? – 2012-08-14 11:07:06

+0

@AmberArroway你應該總結關閉頻率。因此:'1(10和5 = 15)'2(15和10 = 25)''3(25和30)'和'4:(20和25)'5(55和45)'我沒有分開3和4步。 – 2012-08-14 11:11:49