Skip to content

Commit 937cbf0

Browse files
committed
Add Huffman algorithm
1 parent a816c5c commit 937cbf0

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

  • src/main/java/com/packt/datastructuresandalg/lesson4/huffman
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.packt.datastructuresandalg.lesson4.huffman;
2+
3+
import java.util.Comparator;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.PriorityQueue;
7+
8+
public class Huffman {
9+
static class Node {
10+
public Node left;
11+
public Node right;
12+
public Integer frequency;
13+
public Character character;
14+
15+
public Node() {
16+
left = right = null;
17+
frequency = 0;
18+
character = null;
19+
}
20+
}
21+
22+
Node build(Map<Character, Integer> frequencies) {
23+
int N = frequencies.size();
24+
PriorityQueue<Node> pq = new PriorityQueue<>(N,
25+
(o1, o2) -> Integer.signum(o1.frequency - o2.frequency));
26+
for (Map.Entry<Character, Integer> entry : frequencies.entrySet()) {
27+
Node n = new Node();
28+
n.character = entry.getKey();
29+
n.frequency = entry.getValue();
30+
pq.add(n);
31+
}
32+
for (int i = 0; i < N - 1; i++) {
33+
Node n = new Node();
34+
n.left = pq.remove();
35+
n.right = pq.remove();
36+
n.frequency = n.left.frequency + n.right.frequency;
37+
pq.add(n);
38+
}
39+
return pq.remove();
40+
}
41+
42+
public static String decode(String encoding, Node current, Node code, String s) {
43+
if (current.character != null)
44+
return decode(encoding, code, code, s + current.character);
45+
if (encoding.isEmpty())
46+
return s;
47+
if (encoding.charAt(0) == '0')
48+
return decode(encoding.substring(1), current.left, code, s);
49+
return decode(encoding.substring(1), current.right, code, s);
50+
}
51+
52+
public static String decode(String encoding, Node code) {
53+
return decode(encoding, code, code, "");
54+
}
55+
56+
public static void main(String[] args) {
57+
Map<Character, Integer> frequencies = new HashMap<>();
58+
frequencies.put('a', 45000);
59+
frequencies.put('b', 13000);
60+
frequencies.put('c', 12000);
61+
frequencies.put('d', 16000);
62+
frequencies.put('e', 9000);
63+
frequencies.put('f', 5000);
64+
65+
Huffman huffman = new Huffman();
66+
Node code = huffman.build(frequencies);
67+
68+
System.out.println(Huffman.decode("001011101", code));
69+
}
70+
}

0 commit comments

Comments
 (0)