Skip to content

Commit 69ccdd6

Browse files
sklanzsparal
authored andcommitted
Added java implementation of Huffman compression (#181)
* Implementation of Huffman compression in Java * Update CONTRIBUTORS.md * Update huffman.java * Some of the requested changes. I've made some of the requested changes. * Update huffman.java * Added java in huffman.md
1 parent 4e0a41b commit 69ccdd6

File tree

3 files changed

+118
-2
lines changed

3 files changed

+118
-2
lines changed

CONTRIBUTORS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ Gathros
55
Jeremie Gillet (- Jie -)
66
Salim Khatib
77
Hitesh C
8+
Shaurya
89
Maxime Dherbécourt
910
Jess 3Jane
1011
Pen Pal
1112
Chinmaya Mahesh
1213
Unlambder
1314
Kjetil Johannessen
14-
CDsigma
15+
CDsigma
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import java.util.*;
2+
3+
class TreeNode {
4+
String letter = "";
5+
int frequency = 0;
6+
TreeNode left = null, right = null;
7+
8+
public TreeNode(String letter, int frequency) {
9+
this.letter = letter;
10+
this.frequency = frequency;
11+
}
12+
13+
public TreeNode(int frequency, TreeNode left, TreeNode right) {
14+
this.frequency = frequency;
15+
this.left = left;
16+
this.right = right;
17+
}
18+
}
19+
20+
class HuffmanTree {
21+
private Map<String, Integer> frequencyMap = new HashMap<>();
22+
private Map<String, String> codeBook = new HashMap<>(), reverseCodeBook = new HashMap<>();
23+
private TreeNode root;
24+
private String stringToEncode;
25+
26+
public HuffmanTree(String stringToEncode) {
27+
this.stringToEncode = stringToEncode;
28+
}
29+
30+
public void createTree() {
31+
for (int i = 0; i < stringToEncode.length(); i++) {
32+
String key = Character.toString(stringToEncode.charAt(i));
33+
if (!frequencyMap.containsKey(key)) {
34+
frequencyMap.put(key, 1);
35+
} else {
36+
int frequency = frequencyMap.get(key) + 1;
37+
frequencyMap.replace(key, frequency);
38+
}
39+
}
40+
Queue<TreeNode> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(o -> o.frequency));
41+
for (Map.Entry<String, Integer> m : frequencyMap.entrySet()) {
42+
priorityQueue.add(new TreeNode(m.getKey(), m.getValue()));
43+
}
44+
while (priorityQueue.size() > 1) {
45+
TreeNode left = priorityQueue.remove();
46+
TreeNode right = priorityQueue.remove();
47+
priorityQueue.add(new TreeNode(left.frequency + right.frequency, left, right));
48+
}
49+
root = priorityQueue.remove();
50+
}
51+
52+
private void traverse(TreeNode node, StringBuilder code) {
53+
if (node.left == null && node.right == null) {
54+
codeBook.put(node.letter, code.toString());
55+
}
56+
if (node.left != null) {
57+
traverse(node.left, code.append(0));
58+
code.deleteCharAt(code.length() - 1);
59+
}
60+
if (node.right != null) {
61+
traverse(node.right, code.append(1));
62+
code.deleteCharAt(code.length() - 1);
63+
}
64+
}
65+
66+
public void printCodeBook() {
67+
System.out.println("Code Book");
68+
for (Map.Entry<String, String> m : codeBook.entrySet()) {
69+
System.out.println(m.getKey() + "\t" + m.getValue());
70+
}
71+
System.out.println();
72+
}
73+
74+
private void CodeBookReverse() {
75+
for (Map.Entry<String, String> m : codeBook.entrySet()) {
76+
reverseCodeBook.put(m.getValue(), m.getKey());
77+
}
78+
}
79+
80+
public String encode() {
81+
traverse(root, new StringBuilder());
82+
StringBuilder encode = new StringBuilder();
83+
for (int i = 0; i < stringToEncode.length(); i++) {
84+
String k = Character.toString(stringToEncode.charAt(i));
85+
encode.append(codeBook.get(k));
86+
}
87+
printCodeBook();
88+
return encode.toString();
89+
}
90+
91+
public String decode(String encoded) {
92+
StringBuilder decoded = new StringBuilder(), key = new StringBuilder();
93+
CodeBookReverse();
94+
for (int i = 0; i < encoded.length(); i++) {
95+
key = key.append(encoded.charAt(i));
96+
if (reverseCodeBook.containsKey(key.toString())) {
97+
decoded.append(reverseCodeBook.get(key.toString()));
98+
key = new StringBuilder();
99+
}
100+
}
101+
return decoded.toString();
102+
}
103+
}
104+
105+
class Huffman {
106+
public static void main(String[] args) {
107+
HuffmanTree huffmanTree = new HuffmanTree("bibbity_bobbity");
108+
huffmanTree.createTree();
109+
String encoded = huffmanTree.encode();
110+
System.out.println("Encoded String: " + encoded);
111+
System.out.println("Decoded String: " + huffmanTree.decode(encoded));
112+
}
113+
}

chapters/data_compression/huffman/huffman.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ Program.cs
8484
{% sample lang="js" %}
8585
### JavaScript
8686
[import, lang:"javascript"](code/javascript/huffman.js)
87+
{% sample lang="java" %}
88+
### Java
89+
[import, lang:"java"](code/java/huffman.java)
8790
{% endmethod %}
8891

89-
9092
<script>
9193
MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
9294
</script>

0 commit comments

Comments
 (0)