Created
August 27, 2014 13:42
-
-
Save javi830810/f55f46898a12a95c1176 to your computer and use it in GitHub Desktop.
Huffman Encoding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace huffman | |
{ | |
public class Huffman | |
{ | |
public Huffman () | |
{ | |
} | |
public string Encode(string toEncode){ | |
var frequencies = GetFrequencies(toEncode); | |
var initialTree = frequencies.Values.ToList(); | |
var tree = GetTree(initialTree); | |
var result = new StringBuilder(); | |
foreach (var x in toEncode) { | |
result.Append(GetCharEncoding(x.ToString(), tree)); | |
} | |
return result.ToString(); | |
} | |
private string GetCharEncoding(string x, Node huffmanTree){ | |
if (huffmanTree.Character.Length == 1 && huffmanTree.Character == x) | |
return string.Empty; | |
else if (huffmanTree.left.Character.Contains (x)) | |
return "0" + GetCharEncoding (x, huffmanTree.left); | |
else | |
return "1"+ GetCharEncoding (x, huffmanTree.right); | |
} | |
private Dictionary<char,Node> GetFrequencies(string toEncode){ | |
Dictionary<char,Node> nodeFrequency = new Dictionary<char, Node> (); | |
foreach (var x in toEncode) { | |
if (nodeFrequency.ContainsKey (x)) | |
nodeFrequency [x].Frequency++; | |
else | |
nodeFrequency [x] = new Node (){ Frequency = 1, Character = x.ToString() }; | |
} | |
return nodeFrequency; | |
} | |
private Node GetTree(List<Node>nodes){ | |
nodes.Sort(); | |
if (nodes.Count == 0) | |
return null; | |
else if (nodes.Count == 1) | |
return nodes[0]; | |
var min = nodes [0]; | |
var secondMin = nodes [1]; | |
nodes.RemoveAt (0);//Remove First | |
nodes.RemoveAt (0);//Remove First | |
nodes.Insert(0, new Node(){Character = min.Character+secondMin.Character,Frequency = min.Frequency + secondMin.Frequency, left = min, right = secondMin}); | |
return GetTree(nodes); | |
} | |
} | |
public class Node:IComparable{ | |
public int CompareTo (object obj) | |
{ | |
var x = (Node)obj; | |
return this.Frequency.CompareTo (x.Frequency); | |
} | |
public string Character{get;set;} | |
public Node left; | |
public Node right; | |
public int Frequency{ get; set; } | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment