我正在进行scala coursera课程并试图为huffman算法的'decode'方法编写实现。我是斯卡拉的新手。
以下是我的代码(到目前为止)。
def decode(tree: CodeTree, bits: List[Bit]): List[Char] = {
def innerDecode(subTree: CodeTree, subBits: List[Bit]): List[Char] =
subBits match {
case head :: rest => {
subTree match {
case Leaf(c, w) => c :: innerDecode(tree, rest)
case Fork(left, right, _, _) => {
if ( head == 0) innerDecode(left, rest)
else innerDecode(right, rest)
}
}
}
case Nil => List[Char]()
}
innerDecode(tree, bits)
}
编写测试时,例如下面:
val decoded = decode(t1, List(0, 1))
assert(decoded === List('a','b'))// decoded is returned as List('a') instead of List('a','b')
将t1
视为:Fork(Leaf('a',2), Leaf('b',3), List('a','b'), 5)
有人可以建议为什么实施将只返回List('a')
我假设aabbb
的编码是:
a -> 0
b -> 1
答案 0 :(得分:0)
在Huffman解码中,每次分叉,向右或向左,你都会取subBits
一位。在您的实现中,您在分叉时和到达Leaf
时执行此操作。每当你收到一封信,你就会再扔一点。
在你的情况下,你可以看到更多的测试:
decode(List(0,1)) === List(a)
decode(List(0,0,1)) === List(a,b)
decode(List(0,0,0)) === List(a,a)
decode(List(0,1,0)) === List(a,a)
或者您可以使用调试器并逐步执行代码。