}
val freq
= left.
freq + right.
freq }
def huffman
[A
](ls
: List
[(A, Int
)]): List
[(A, String
)] = { def makeTree
(ls
: List
[Node
[A
]]): Node
[A
] = ls
match{ val last
= ls.
sortBy(_.
freq).
slice(0,
2) makeTree(Branch(last(0), last(1)) :: ls filterNot {last.contains})
}
}
def huffmanCode
(n
: Node
[A
], code
: String
): List
[(A, String
)] = n
match{ case Leaf
(element, freq
) => List
((element, code
)) case Branch
(left, right
) => huffmanCode
(left, code +
"0") ::: huffmanCode
(right, code +
"1") }
val top
= makeTree
(ls map
{n
=> Leaf
(n.
_1, n.
_2
): Node
[A
]}) huffmanCode(top, "")
}
def main
(args
: Array
[String
]){ println(huffman(List(("a", 45), ("b", 13), ("c", 12), ("d", 16), ("e", 9), ("f", 5))))
}
}
b2JqZWN0IE1haW57CiAgYWJzdHJhY3Qgc2VhbGVkIGNsYXNzIE5vZGVbQV17CiAgICB2YWwgZnJlcTogSW50CiAgfQogIAogIGNhc2UgY2xhc3MgTGVhZltBXShlbGVtZW50OiBBLCBmcmVxOiBJbnQpIGV4dGVuZHMgTm9kZVtBXQogIGNhc2UgY2xhc3MgQnJhbmNoW0FdKGxlZnQ6IE5vZGVbQV0sIHJpZ2h0OiBOb2RlW0FdKSBleHRlbmRzIE5vZGVbQV17CiAgICB2YWwgZnJlcSA9IGxlZnQuZnJlcSArIHJpZ2h0LmZyZXEKICB9CiAgCiAgZGVmIGh1ZmZtYW5bQV0obHM6IExpc3RbKEEsIEludCldKTogTGlzdFsoQSwgU3RyaW5nKV0gPSB7CiAgICBkZWYgbWFrZVRyZWUobHM6IExpc3RbTm9kZVtBXV0pOiBOb2RlW0FdID0gbHMgbWF0Y2h7CiAgICAgIGNhc2UgTmlsID0+IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgY2FzZSB0b3AgOjogTmlsID0+IHRvcAogICAgICBjYXNlIF8gPT4gewoJdmFsIGxhc3QgPSBscy5zb3J0QnkoXy5mcmVxKS5zbGljZSgwLCAyKQoJbWFrZVRyZWUoQnJhbmNoKGxhc3QoMCksIGxhc3QoMSkpIDo6IGxzIGZpbHRlck5vdCB7bGFzdC5jb250YWluc30pCiAgICAgIH0KICAgIH0KICAgIGRlZiBodWZmbWFuQ29kZShuOiBOb2RlW0FdLCBjb2RlOiBTdHJpbmcpOiBMaXN0WyhBLCBTdHJpbmcpXSA9IG4gbWF0Y2h7CiAgICAgIGNhc2UgTGVhZihlbGVtZW50LCBmcmVxKSA9PiBMaXN0KChlbGVtZW50LCBjb2RlKSkKICAgICAgY2FzZSBCcmFuY2gobGVmdCwgcmlnaHQpID0+IGh1ZmZtYW5Db2RlKGxlZnQsIGNvZGUgKyAiMCIpIDo6OiBodWZmbWFuQ29kZShyaWdodCwgY29kZSArICIxIikKICAgICAgY2FzZSBfID0+IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgIH0KICAgIHZhbCB0b3AgPSBtYWtlVHJlZShscyBtYXAge24gPT4gTGVhZihuLl8xLCBuLl8yKTogTm9kZVtBXX0pCiAgICBodWZmbWFuQ29kZSh0b3AsICIiKQogIH0KCiAgZGVmIG1haW4oYXJnczogQXJyYXlbU3RyaW5nXSl7CiAgICBwcmludGxuKGh1ZmZtYW4oTGlzdCgoImEiLCA0NSksICgiYiIsIDEzKSwgKCJjIiwgMTIpLCAoImQiLCAxNiksICgiZSIsIDkpLCAoImYiLCA1KSkpKQogIH0KfQo=
List((a,0), (c,100), (b,101), (f,1100), (e,1101), (d,111))