14 lines
525 B
Raku
14 lines
525 B
Raku
sub huffman (%frequencies) {
|
|
my @queue = %frequencies.map({ [.value, .key] }).sort;
|
|
while @queue > 1 {
|
|
given @queue.splice(0, 2) -> ([$freq1, $node1], [$freq2, $node2]) {
|
|
@queue = (|@queue, [$freq1 + $freq2, [$node1, $node2]]).sort;
|
|
}
|
|
}
|
|
hash gather walk @queue[0][1], '';
|
|
}
|
|
|
|
multi walk ($node, $prefix) { take $node => $prefix; }
|
|
multi walk ([$node1, $node2], $prefix) { walk $node1, $prefix ~ '0';
|
|
walk $node2, $prefix ~ '1'; }
|