Skip to content

Instantly share code, notes, and snippets.

@bojanrajkovic
Created December 5, 2010 22:18
Show Gist options
  • Save bojanrajkovic/729538 to your computer and use it in GitHub Desktop.
Save bojanrajkovic/729538 to your computer and use it in GitHub Desktop.
HuffmanNode F (Queue<HuffmanNode> q1, Queue<HuffmanNode> q2) {
return q2.Count == 0 || (q1.Count > 0 && q2.Count > 0 && q1.Peek ().v < q2.Peek ().v) ?
q1.Dequeue () :
q2.Dequeue ();
}
public HuffmanNode GetTree (string data) {
Queue<HuffmanNode> p = new Queue<HuffmanNode> (Frequencies (data));
Queue<HuffmanNode> q = new Queue<HuffmanNode> ();
while (p.Any () || q.Count > 1) {
HuffmanNode l = F (p, q), r = F (p, q), t = l + r;
q.Enqueue (t);
}
return q.Dequeue ();
}
/**
* Decides which queue we should dequeue a node from when building the tree—the first queue represents the original
* nodes, the second queue contains portions of the tree as it's built.
*/
private static HuffmanNode chooseNodeFromQueues (Queue<HuffmanNode> first, Queue<HuffmanNode> second) {
return (second.size () == 0 || (first.size () > 0 && second.size () > 0 && first.peek ().value < second.peek ().value)) ?
first.remove () :
second.remove ();
}
/**
* Converts a frequency map to a node queue.
*/
private static Queue<HuffmanNode> frequencyMapToQueue (Map<Character, Integer> frequencyMap) {
Queue<HuffmanNode> queue = new LinkedList<HuffmanNode> ();
for (Map.Entry<Character, Integer> e : frequencyMap.entrySet ()) {
HuffmanNode h = new HuffmanNode ();
h.character = e.getKey ();
h.value = e.getValue ();
queue.add (h);
}
System.out.println (queue.size ());
return queue;
}
/**
* Converts a frequency map to a Huffman tree.
*/
public static HuffmanNode frequencyMapToHuffmanTree (Map<Character, Integer> frequencyMap) {
Queue<HuffmanNode> primary = frequencyMapToQueue (frequencyMap);
Queue<HuffmanNode> secondary = new LinkedList<HuffmanNode> ();
while (primary.size () > 0 || secondary.size () > 1) {
HuffmanNode left = chooseNodeFromQueues (primary, secondary);
HuffmanNode right = chooseNodeFromQueues (primary, secondary);
System.out.println ("Nodes picked: " + left.character + " and " + right.character);
HuffmanNode newNode = new HuffmanNode ();
newNode.left = left;
newNode.right = right;
newNode.character = null;
newNode.value = left.value + right.value;
secondary.add (newNode);
}
return secondary.remove ();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment