using System.Collections.Generic;
public static void Main()
string strr="hi man i love youuuuuuuuuuuuuu";
Dictionary<char,int> frequencies = HuffmanEncoding.BuildFrequencies(strr);
foreach(var item in frequencies)
Console.WriteLine("{0} has frequency of {1}",item.Key,item.Value);
Dictionary<char,string> lookupTable= HuffmanEncoding.BuildLookUpTable(HuffmanEncoding.BuildHuffmanTree(frequencies));
foreach(var item in lookupTable)
Console.WriteLine("{0} has string: {1}",item.Key,item.Value);
Console.WriteLine("str={0}, compressed={1}",strr,HuffmanEncoding.CompressString(strr,lookupTable));
public static Dictionary<char,int> BuildFrequencies(string str)
Dictionary<char,int> frequencies = new Dictionary<char,int>();
if(frequencies.TryGetValue(ch,out freq))
frequencies.Add(ch,freq+1);
public static Node BuildHuffmanTree(Dictionary<char,int> freqs)
PriorityQueue<Node> pq = new PriorityQueue<Node>();
foreach(var item in freqs)
pq.Enqueue(new Node(item.Key,item.Value));
pq.Enqueue(new Node('j',1));
Node left = pq.Dequeue();
Node right = pq.Dequeue();
Console.WriteLine("enqueuing left={0},right={1}",left.Ch,right.Ch);
pq.Enqueue(new Node('\0',left.Freq+right.Freq,left,right));
public static Dictionary<char,string> BuildLookUpTable(Node node)
Dictionary<char,string> lookupTable = new Dictionary<char,string>();
BuildLookUpTableRec(node, "",lookupTable);
public static void BuildLookUpTableRec(Node node, string input, Dictionary<char,string> lookupTable)
BuildLookUpTableRec(node.left,input+'0',lookupTable);
BuildLookUpTableRec(node.right,input+'1',lookupTable);
lookupTable.Add(node.Ch,input);
public static string CompressString(string str, Dictionary<char,string> lookupTable)
StringBuilder sb = new StringBuilder();
if(lookupTable.TryGetValue(ch,out output))
class Node:IComparable<Node>{
public int Freq{get;set;}
public Node(char ch,int freq)
public Node(char ch,int freq,Node left,Node right)
return this.left==null && this.right==null;
public int CompareTo(Node other)
return this.Freq.CompareTo(other.Freq);
public void Enqueue(T element)