Scala霍夫曼解码

时间:2017-10-01 23:38:36

标签: scala decoding huffman-code

我正在进行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

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)

或者您可以使用调试器并逐步执行代码。