【问题标题】:Scala huffman decoding斯卡拉霍夫曼解码
【发布时间】:2017-10-01 23:38:35
【问题描述】:

我正在学习 scala coursera 课程并尝试为霍夫曼算法的“解码”方法编写一个实现。我是 scala 的新手。

以下是我的代码(到目前为止)。

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

【问题讨论】:

    标签: scala decoding huffman-code


    【解决方案1】:

    在 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)
    

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

    【讨论】:

    • 感谢您的回答。是的,这就是问题所在。我真的不应该在到达叶子时使用这个钻头。 head::rest 也有一个小问题,当到达最后一个字符时,rest 下降到“Nil”部分,因此忽略了案例。必须对最后一个元素的“Case Fork”部分进行额外检查。部分是我对模式匹配如何与链表一起工作的误解。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多