【问题标题】:Are there multiple ways to do Huffman encoding?有多种方法可以进行霍夫曼编码吗?
【发布时间】:2016-02-23 02:09:32
【问题描述】:

所以我制作了一个应该进行霍夫曼编码的程序。在将我的答案与正确答案进行比较时,并非我的所有答案都匹配。

我明白了

[("a","0"),("c","100"),("b","101"),("d","110"),("f","1110"),("e","1111")]

正确答案是

[('a',"0"),('b',"101"),('c',"100"),('d',"111"),('e',"1101"),('f',"1100")]

正确的树是

然而,我的方法给了我一个小小的改变。在分支 30 上,我使用 0 而不是 1 到达 D。

所以这让我想知道,两个答案都正确吗?毕竟它们都具有相同的字符串长度。

如果我错了,有人可以解释为什么吗?

如果有人需要,我的代码是用下面的 Haskell 编写的

mergHufffman::(String,Int) -> (String,Int) -> (String,Int)
mergHufffman x y =  (fst x ++ fst y, snd x + snd y)

data HTree a = Leaf a | Branch (HTree a) (HTree a) deriving Show

treeHuff::[(String,Int)] -> HTree (String,Int)
treeHuff (x:[]) = Leaf x
treeHuff (x:y:[])
        | snd x < snd y = Branch (Leaf x) (Leaf y)
        | snd x > snd y = Branch (Leaf y) (Leaf x)
treeHuff (x:y:z:list)
        | snd x > snd merged = Branch (Leaf x) (treeHuff $ sortFirst $ y:z:list)
        | otherwise = Branch (treeHuff $ y:z:[]) (treeHuff $ sortFirst $ x:list)
        where merged = mergHufffman y z 

sortFirst::[(String,Int)]->[(String,Int)]
sortFirst freq = reverse $ sortBy (comparing snd) freq

readHuffTree :: HTree (String,Int)-> String -> [(String, String)]
readHuffTree (Branch x y) code = f1 ++ f2
                          where 
                          f1 = readHuffTree x (code ++ "0")
                          f2 = readHuffTree y (code ++ "1")
readHuffTree (Leaf x) code = ((fst x, code):[])

【问题讨论】:

  • 通常在讲座中介绍霍夫曼编码的第一件事是 1) 最佳编码不是唯一的 2) 如果两个最不可能的符号是兄弟姐妹,则存在最佳编码他们的高度是最大的。根据这些观察结果,我们遵循经典算法。

标签: haskell huffman-code


【解决方案1】:

是的,您可以根据自己的喜好为左右分支分配 0 和 1,并且您仍然可以获得最佳的 Huffman 代码。两个答案都是正确的,除非分配指定如何将位值分配给分支。事实上,有 32 个正确答案,因为有五个分支,每个分支有两个选择。

正如这些频率所发生的那样,那棵树是唯一可能的树。但是,有一些频率集可以给出具有不同拓扑的树。

一个简单的例子是频率 1、1、2、2 的集合。当您应用 Huffman 算法时,您会发现在第二步中选择两个最低频率时可以做出任意选择。根据您所做的选择,您最终会得到所有代码长度相同 (2) 的树,或者最终得到长度为 1、2、3 和 3 的代码。这两个代码都是正确答案。哦,对于 1、2、3、3 树,您可以选择频率为 2 的符号位于顶部。所以实际上三种不同的树是可能的。对于每棵树,您有八种方法来分配 0 和 1。所以在这种情况下有 24 个正确答案。如果将代码长度乘以频率并将它们相加,您会看到两种树拓扑都为 12,因此两者都是最优的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多