【问题标题】:How do generate this Huffmann Tree (similar to binary trees)如何生成这个霍夫曼树(类似于二叉树)
【发布时间】:2012-08-14 09:53:26
【问题描述】:

我了解当频率彼此不同时如何创建霍夫曼树,但如果频率很少相同,我将如何绘制此霍夫曼树:

哈夫曼树的简单解释见here

我正在尝试创建的霍夫曼树的数据:

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

现在我从字母CD 的两个最低频率开始

   .
  / \
 C   D

但是下一步是什么?因为我们有AB 的频率相同,所以我们选择哪一个?如果我们选择其中一个,那么在选择第二个时,结构会如何看待?

如果我选择B,它会是这个样子(除非我错了)

     .
    / \
   B   .
      / \
     C   D

这一步之后呢???

这些也可以用 Java 和 C 编码,我试图在实现它们之前先弄清楚它们是如何工作的。

编辑

我的树是这样的:

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

网上也有例子

【问题讨论】:

  • 你总是选择两个最低频率,所以你的第二步是错误的。您不会选择 CD 和 B(分别为 20% 和 15%)——您选择 A 和 B(15% 和 15%)。对于这组特定的频率,选择最低的两个频率绝不会模棱两可。然而,这可能发生。您可以拥有具有不同拓扑结构的多个不同树的频率集。然而,在应用频率的情况下,它们都具有完全相同的平均位数,并且都是最优的。

标签: java tree binary-tree huffman-code


【解决方案1】:

逐步解答您的问题。

所以你开始

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

【讨论】:

    【解决方案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   
    

    【讨论】:

    • 我了解第 1 步和第 2 步,但不明白您为第 3 步做了什么。为什么要将 B 和 E 分开??
    • @AmberArroway 你应该总结关闭频率。因此:1 (10 and 5 = 15) 2(15 和 10 = 25)`3 (25 and 30) 和`4:(20 和 25)`5 (55 and 45) 我没有将第 3 步和第 4 步分开。
    • 让我把我画的树贴出来,你能告诉我哪里出错了吗?
    • @AmberArroway 你能问一下你不明白什么吗?我会尽量回答你的问题。
    • 我们选择两棵重量最轻的树(如果多于两棵,则选择任意棵)。将选择的两棵树合并成一棵树,并带有一个新的根节点,其左右子树是我们选择的两个。新树的权重是合并树的权重之和???
    【解决方案3】:

    您选择哪个并不重要,您会得到一些不同的编码,但概率相同。在某些情况下有更多可能的方式来构建树,但这并不重要。

    我已经编辑了图像,因为我犯了一个错误,但请查看我的第二个答案以获得正确的答案。

    【讨论】:

    • 另一个答案和你的不一样……哪个是对的哈哈
    • 我很确定这个是正确的。除非我犯了一些愚蠢的错误(但我检查了它),否则我在 uni+exam 中已经有了它,但我创建它的方式是正确的。如果你按照 Lajos Arpad 的方式,你最终会得到这么深的树,我认为这是不正确的。
    • 他的连我的都不一样,我画的那棵树也包括在内
    • 创建树的方法很简单,你总是选择两个概率最低的子树并加入它们。一开始你有7个子树。一旦你开始将它们连接到更大的树中,它们在父节点的概率总和。
    • 看看我上传的图片
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多