Popularity
3.0
Stable
Activity
0.0
Stable
19
2
2

Monthly Downloads: 8
Programming language: Elixir
License: MIT License

huffman alternatives and similar packages

Based on the "Encoding and Compression" category.
Alternatively, view huffman alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of huffman or a related project?

Add another 'Encoding and Compression' Package

README

Huffman

Huffman encoding and decoding.

Huffman coding is great for compressing binary data, especially with binaries that contain a lot of repetition.

Installation

Add the following to your mix.exs under deps:

{:huffman, "~> 1.1"}

Usage

There are really just two functions to care about, encode and decode

{encoded, keys} = Huffman.encode "Lil Wayne is the best rapper alive."
Huffman.decode encoded, keys
# returns "Lil Wayne is the best rapper alive."

The encode function takes a second optional argument in case the input is utf16 or utf32. Decode returns whatever encoding it was given.

{encoded, keys} = Huffman.encode(<<"bananas"::utf32>>, :utf32)
Huffman.decode(encoded, keys)
# returns <<0, 0, 0, 98, 0, 0, 0, 97, 0, 0, 0, 110, 0, 0, 0, 97, 0, 0, 0, 110, 0, 0, 0, 97, 0, 0, 0, 115>>

Internals

In case you care!

The basic formula is to calculate the frequencies of individual bytes, generate a binary-tree structure, then walk that tree to determine each byte's encoded value.

Huffman.Tree

Huffman tree implementation. Can either take in a set of keys and weights to build a corresponding tree (to calculated their encoded values) or take in a set of codes and their corresponding codes to rebuild the tree.

Example:

Given the following codes (binary representation in comment) and keys, we can reconstruct the huffman tree for decoding.

codes_and_keys = %{
  {<<4::size(3)>>, "n"},  # 100
  {<<7::size(3)>>, " "},  # 111
  {<<13::size(4)>>, "i"}, # 1101
  {<<11::size(4)>>, "e"}, # 1011
  {<<10::size(4)>>, "o"}, # 1010
  {<<5::size(4)>>, "f"},  # 0101
  {<<3::size(4)>>, "a"},  # 0111
  {<<2::size(4)>>, "m"},  # 0011
  {<<1::size(4)>>, "s"},  # 0001
  {<<24::size(5)>>, "l"}, # 11000
  {<<9::size(5)>>, "x"},  # 01001
  {<<8::size(5)>>, "g"},  # 01000
  {<<0::size(5)>>, "p"},  # 00000
  {<<25::size(6)>>, "t"}  # 011001
}
Huffman.Tree.from_codes(codes_and_keys)

Underneath, this is what the tree will look like: huffmantree