【问题标题】:Huffman coding is based on what Greedy Approach or Dynamic Programming霍夫曼编码是基于什么贪婪方法或动态规划
【发布时间】:2013-05-12 19:08:47
【问题描述】:

我们可以使用动态规划解决霍夫曼编码问题吗,有什么算法

【问题讨论】:

    标签: algorithm huffman-code


    【解决方案1】:

    霍夫曼编码通过创建节点的二叉树来工作。这些可以存储在一个常规数组中,其大小取决于符号的数量 n。通过使用Greedy Algorithm 方法,可以在O(n logn) 时间内实现霍夫曼编码。霍夫曼编码不适用于动态规划解决方案,因为该问题不包含重叠的子问题。

    【讨论】:

      【解决方案2】:

      根据我对算法的了解,我相信霍夫曼编码是基于贪婪方法的。 正如我们在活动选择问题中所做的那样。任务调度和背包问题是另一个例子。

      【讨论】:

      • IIRC 的标准方法是使用优先级队列(例如二进制堆)。低概率意味着高优先级。用字母表的初始叶节点填充队列。取出两个最高优先级(即最低概率)。添加一个以这些为子节点的节点,其概率为总和,然后将该新子树添加回优先级队列。重复直到队列中只剩下一项。
      • 我猜在每一步选择两个最少存在的子树来形成可能最少的新子树被认为是贪婪的,因为在每一步它都会最大化下一组子树的entropy
      【解决方案3】:

      [更新]:我认为我下面提到的解决方案会生成最佳前缀码,但不一定与霍夫曼码相同。根据定义,霍夫曼代码是通过贪婪方法生成的。虽然它是最佳的,但它不是唯一的解决方案。 (例如,一旦生成了 Huffman 树,您可以交换同一级别的叶子,以赋予它们不同的代码,同时仍然是最优的)


      我认为这可以使用动态编程来解决,尽管效率不会那么高。这里的方法与查找最优二叉搜索树非常相似,因为当您向下一层时,您会在叶子中添加更多位。

      Here 是代码计算最小总位数的链接。当然这是指数级的,但如果你使用 DP,它可以在 O(n^2) 时间内解决。我没有尝试生成编码,但我相信应该是可能的。

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 2013-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多