【问题标题】:What is the running time and space complexity of a huffman decode algorithm?霍夫曼解码算法的运行时间和空间复杂度是多少?
【发布时间】:2013-12-17 14:57:57
【问题描述】:

假设我们从一个文本文件开始,例如:

a 00 
b 01
c 10
d 11

00000001011011

该算法是典型的算法,您使用前缀构建 Huffman 树,在遍历树时读取编码位,直到到达叶子,然后在该叶子处返回字符。

有人能解释一下我将如何确定运行时间和空间复杂度吗?

【问题讨论】:

  • 维基页面是怎么说的?
  • 您已经描述了执行此操作的算法,但您也有代码吗?时间复杂度可能因您的实施而异。

标签: algorithm big-o huffman-code big-theta


【解决方案1】:

假设一个长度为 n 的编码文本字符串和一个由 k 个符号组成的字母表。

对于每个编码符号,您必须遍历树才能解码该符号。这棵树包含 k 个节点,平均,它需要 O(log k) 个节点访问来解码一个符号。所以时间复杂度是 O(n log k)。

树的空间复杂度为 O(k),解码文本的空间复杂度为 O(n)。

【讨论】:

  • 为什么时间复杂度是O(k)?在最坏的情况下,输出树可能是具有 k+k\2+k\4+...+1=O(k^2) 个节点的完整二叉树。
  • @so.very.tired:重新阅读我的答案。我说过空间复杂度是O(k)。如果有 k 个字符,则树中有 k 个节点。
  • 对不起,我一直想问:“为什么空间复杂度是......等等......”,我错误地写了“时间”而不是“空间”。在霍夫曼树中,字母由 terminal 节点(不仅仅是任何节点)表示,因此对于 k 个字符,有 k 个终端节点,这意味着树可以像我说的那样以 O( k^2) 个节点(终端和内部)。
【解决方案2】:

哈夫曼树上基本上有三种方法,构造、编码和解码。时间复杂度可能会有所不同。

我们应该首先注意到(参见 Wikipedia [link]):

在很多情况下,时间复杂度对这里算法的选择并不是很重要,因为这里的n是字母表中的符号个数,通常是一个很小的数字(与要编码的消息长度相比) );而复杂性分析关注的是当 n 变得非常大时的行为。

  1. 如果对输入概率进行排序,则构造的复杂性是线性的 (O(n)),请参见 paper。在大多数情况下,我们使用贪婪的 O(n*log(n)) 构造方法: http://www.siggraph.org/education/materials/HyperGraph/video/mpeg/mpegfaq/huffman_tutorial.html
  2. 如果为所有符号构建双向哈希表,则编码和解码都将保持不变 (O(1))。

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2018-03-02
    • 2012-04-09
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多