Skip to content

Instantly share code, notes, and snippets.

@antirez
Created April 2, 2009 22:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antirez/89544 to your computer and use it in GitHub Desktop.
Save antirez/89544 to your computer and use it in GitHub Desktop.
recursive huffman coding
def buildHuffmanCode(ftab)
if ftab.length == 1
ftab
else
ftab = ftab.sort {|a,b| a[0] <=> b[0]}
left = ftab[0]
right = ftab[1]
freq = left[0]+right[0]
left = left[1].map{|x| x.merge({:code => "0"+x[:code]})}
right = right[1].map{|x| x.merge({:code => "1"+x[:code]})}
buildHuffmanCode(ftab[2..-1]+[[freq,left+right]])
end
end
def hashToFrequencyTable(ft)
ft.map{|sym,freq|
[freq,[{:sym => sym, :code => ""}]]
}
end
ft = {"a" => 45, "b" => 13, "c" => 12, "d" => 16, "e" => 9, "f" => 5}
buildHuffmanCode(hashToFrequencyTable(ft))[0][1].each{|x|
puts "#{x[:sym]} => #{x[:code]}"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment