【发布时间】: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