【问题标题】:Python, understanding Huffman codePython,理解霍夫曼代码
【发布时间】:2015-12-16 22:38:45
【问题描述】:

我试图理解“Rosetta 代码”用 python 编写的 Huffman 代码。以下是代码的一小部分。

def encode(symb2freq):
    heap = [[wt, [sym, ""]] for sym, wt in symb2freq.items()] #What does this do?

我假设变量 heap 是一个列表。但是wtsym 是什么?

【问题讨论】:

  • sym 看起来像符号(作为参数的字典的键)和它们的权重(关联的值)
  • Link 到代码,顺便说一句。
  • 请注意,提出问题而不回应任何答案是不礼貌的行为。评论或单击复选标记以关闭此问题。

标签: python huffman-code


【解决方案1】:

sym2freq 是一个字典,键是一些符号,它们的值是符号的频率。例如,如果您有字符串 'aaabacba',则字典将如下所示

sym2freq = {'a': 5, 'b': 2, 'c': 1}

那是因为我们有 5 次字母 a、2 次字母 b 和 1 次字母 c。

字典有items() 方法,它将返回每个键的元组及其各自的值。在我们的例子中,它会返回

>>> sym2freq.items()
(('a', 5), ('b', 2), ('c', 1))

理解列表的for sym, wt in symb2freq.items() 部分只是拆包。每次我们从上面获取一个元组时,我们将第一个对象分配给变量sym,将第二个对象分配给变量wt。选择名称 sym 和 wt 纯粹是为了反映所代表的值,即符号和权重(频率)。

>>> sym, wt = ('a', 5)
>>> print sym
'a'
>>> print wt
5

由于列表推导会创建结构 [wt, [sym, ""]] 的列表,因此您最终会得到列表

>>> encode(sym2freq)
[[5, ['a', '']], [2, ['b', '']], [1, ['c', '']]]

我们从符号频率字典到像列表heap 这样的结构的原因是,我们可以根据频率对符号进行分类,正如您所了解的,这是构建霍夫曼树的一部分.

【讨论】:

  • 非常感谢@Reti43,精彩的解释!
【解决方案2】:

这是list comprehension。这是说

  • 获取symb2freq 的项目并开始循环它们。
  • 获取symb2freq 中的第一项并将其解压缩为变量symwt
  • 现在将[wt, [sym, ""]] 添加到列表中
  • 为每个项目执行此操作
  • 现在将列表放入变量heap

例如,[bar(x) for x in foo] 创建一个列表,将bar(x) 应用于列表中的每个值。

【讨论】:

    【解决方案3】:

    这是一个有趣的问题。想象一个有五个字母的字典,其中键是字母,值是频率:

    a = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
    

    然后将其映射为一个有频率的列表列表,以及一个以字母开头的列表到堆变量中,如下所示:

    [[1, ['a', '']], [2, ['b', '']], [3, ['c', '']], [4, ['d', '']], [5, ['e', '']]]
    

    然后当你把它堆起来时,你会得到:

    [[1, ['a', '']],
     [3, ['c', '']],
     [2, ['b', '']],
     [5, ['e', '']],
     [4, ['d', '']]]
    

    只需使用有效的字典逐步解决问题,以像维基百科页面上给出的那样进行编码,您将能够看到每个步骤的作用。或者使用一个简单的示例,像我给出的那样开始,然后慢慢增加元素的数量,直到您使用真实的文档。

    rosetta 代码所做的是遍历堆并根据频率将数字添加到您在字母后面看到的空白字符串中,直到每个字母都映射到二进制解释。所以最后你会得到这样的东西:

     [['e', '101'], 
      ['d', '010'], 
      ['c', '1001'], 
      ['b', '1100'], 
      ['a', '1101']]
    

    最常见的字母需要最少的位。

    【讨论】:

      【解决方案4】:

      sym 是符号,wt 是重量。

      https://en.wikipedia.org/wiki/Huffman_coding

      【讨论】:

        猜你喜欢
        • 2017-04-18
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多