1
私はスカラ・コースラ・コースをやっており、ハフマン・アルゴリズムの「デコード」メソッドの実装を書こうとしています。私はスカラーには新しいです。スカラ・ハフマン・デコード
以下は私のコードです(これまでのところ)。
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
を与える:実装はaabbb
ためだけList('a')
エンコードを返しますなぜ誰かが助言してくださいすることができ、私が想定しFork(Leaf('a',2), Leaf('b',3), List('a','b'), 5)
です:ハフマンで
a -> 0
b -> 1
答えをありがとう。はい、それは問題でした。私は本当に葉に到達するときにビットを使用すべきではありませんでした。また、最後の文字に達したときに 'Nil'部分に落ちていたhead :: restに少し問題があったため、ケースを見落としていました。最後の要素については、「ケースフォーク」の部分で余分なチェックをしなければなりませんでした。部分的には、パターンマッチングがリンクされたリストとどのように機能するかについての私の誤解。 – bkm