From e7cd50d3e83930c38a46a7140f4672c85ed79016 Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 07:54:39 +0530 Subject: [PATCH 1/6] Implementation of Huffman compression in Java --- .../huffman/code/java/huffman.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 chapters/data_compression/huffman/code/java/huffman.java diff --git a/chapters/data_compression/huffman/code/java/huffman.java b/chapters/data_compression/huffman/code/java/huffman.java new file mode 100644 index 000000000..26e50f431 --- /dev/null +++ b/chapters/data_compression/huffman/code/java/huffman.java @@ -0,0 +1,125 @@ + +import java.util.*; + +class TreeNode { + String key = ""; + int value = 0; + TreeNode left = null, right = null; + + public TreeNode(String key, int value) { + this.key = key; + this.value = value; + } + + public TreeNode(int value, TreeNode left, TreeNode right) { + this.value = value; + this.left = left; + this.right = right; + } + +} + +class HuffmanTree { + private Map map = new HashMap<>(); + private Map codeBook = new HashMap<>(), reverseCodeBook = new HashMap<>(); + private TreeNode root; + private String s; + + public HuffmanTree(String s) { + this.s = s; + } + + public void createTree() { + for (int i = 0; i < s.length(); i++) { + String key = Character.toString(s.charAt(i)); + if (!key.equals(" ")) { + if (!map.containsKey(key)) map.put(key, 1); + else { + int frequency = map.get(key) + 1; + map.replace(key, frequency); + } + } + } + + Comparator nodeComparator = Comparator.comparingInt(o -> o.value); + + Queue priorityQueue = new PriorityQueue<>(nodeComparator); + for (Map.Entry m : map.entrySet()) { + priorityQueue.add(new TreeNode(m.getKey(), m.getValue())); + } + + + while (priorityQueue.size() > 1) { + TreeNode temp1 = priorityQueue.remove(); + TreeNode temp2 = priorityQueue.remove(); + TreeNode node; + node = new TreeNode(temp1.value + temp2.value, temp1, temp2); + priorityQueue.add(node); + } + root = priorityQueue.remove(); + + } + + private void traverse(TreeNode temp, String w) { + if (temp.left == null && temp.right == null) + codeBook.put(temp.key, w); + if (temp.left != null) traverse(temp.left, w + 0); + if (temp.right != null) traverse(temp.right, w + 1); + + } + + public void printCodeBook() { + System.out.println("Code Book"); + for (Map.Entry m : codeBook.entrySet()) { + System.out.println(m.getKey() + "\t" + m.getValue()); + } + System.out.println(); + } + + private void CodeBookReverse() { + for (Map.Entry m : codeBook.entrySet()) { + reverseCodeBook.put(m.getValue(), m.getKey()); + } + } + + public String encode() { + traverse(root, ""); + String enc = ""; + for (int i = 0; i < s.length(); i++) { + String k = Character.toString(s.charAt(i)); + enc += codeBook.get(k); + } + printCodeBook(); + return enc; + } + + public String decode(String enc) { + String dec = "", key = ""; + CodeBookReverse(); + + for (int i = 0; i < enc.length(); i++) { + key = key + enc.charAt(i); + if (reverseCodeBook.containsKey(key)) { + dec = dec + reverseCodeBook.get(key); + key = ""; + } + } + return dec; + } + + +} + +class Huffman { + + public static void main(String[] args) { + String s = "bibbity_bobbity"; + HuffmanTree huffmanTree = new HuffmanTree(s); + huffmanTree.createTree(); + String encoded = huffmanTree.encode(); + System.out.println("Encoded String: " + encoded); + System.out.println("Decoded String: " + huffmanTree.decode(encoded)); + + + } +} From 49144e41ea77de2190ad859471a01149b82320df Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 07:56:05 +0530 Subject: [PATCH 2/6] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a1ad4161d..a229263c8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -5,3 +5,4 @@ Gathros Jeremie Gillet (- Jie -) Salim Khatib Hitesh C +Shaurya From ea05650d2ff73229d1a9c5b4975a4f0e8bab5485 Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 08:11:42 +0530 Subject: [PATCH 3/6] Update huffman.java --- .../data_compression/huffman/code/java/huffman.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chapters/data_compression/huffman/code/java/huffman.java b/chapters/data_compression/huffman/code/java/huffman.java index 26e50f431..bf42be662 100644 --- a/chapters/data_compression/huffman/code/java/huffman.java +++ b/chapters/data_compression/huffman/code/java/huffman.java @@ -32,13 +32,13 @@ public HuffmanTree(String s) { public void createTree() { for (int i = 0; i < s.length(); i++) { String key = Character.toString(s.charAt(i)); - if (!key.equals(" ")) { - if (!map.containsKey(key)) map.put(key, 1); - else { - int frequency = map.get(key) + 1; - map.replace(key, frequency); - } + + if (!map.containsKey(key)) map.put(key, 1); + else { + int frequency = map.get(key) + 1; + map.replace(key, frequency); } + } Comparator nodeComparator = Comparator.comparingInt(o -> o.value); From d94f59fc0d1fc095ff7facb531c2074c71431030 Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 12:56:15 +0530 Subject: [PATCH 4/6] Some of the requested changes. I've made some of the requested changes. --- .../huffman/code/java/huffman.java | 87 +++++++++---------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/chapters/data_compression/huffman/code/java/huffman.java b/chapters/data_compression/huffman/code/java/huffman.java index bf42be662..8bb39c3da 100644 --- a/chapters/data_compression/huffman/code/java/huffman.java +++ b/chapters/data_compression/huffman/code/java/huffman.java @@ -2,17 +2,17 @@ import java.util.*; class TreeNode { - String key = ""; - int value = 0; + String letter = ""; + int frequency = 0; TreeNode left = null, right = null; - public TreeNode(String key, int value) { - this.key = key; - this.value = value; + public TreeNode(String letter, int frequency) { + this.letter = letter; + this.frequency = frequency; } - public TreeNode(int value, TreeNode left, TreeNode right) { - this.value = value; + public TreeNode(int frequency, TreeNode left, TreeNode right) { + this.frequency = frequency; this.left = left; this.right = right; } @@ -20,51 +20,49 @@ public TreeNode(int value, TreeNode left, TreeNode right) { } class HuffmanTree { - private Map map = new HashMap<>(); + private Map frequencyMap = new HashMap<>(); private Map codeBook = new HashMap<>(), reverseCodeBook = new HashMap<>(); private TreeNode root; - private String s; + private String stringToEncode; - public HuffmanTree(String s) { - this.s = s; + public HuffmanTree(String stringToEncode) { + this.stringToEncode = stringToEncode; } public void createTree() { - for (int i = 0; i < s.length(); i++) { - String key = Character.toString(s.charAt(i)); - - if (!map.containsKey(key)) map.put(key, 1); - else { - int frequency = map.get(key) + 1; - map.replace(key, frequency); + for (int i = 0; i < stringToEncode.length(); i++) { + String key = Character.toString(stringToEncode.charAt(i)); + if (!frequencyMap.containsKey(key)) { + frequencyMap.put(key, 1); + } else { + int frequency = frequencyMap.get(key) + 1; + frequencyMap.replace(key, frequency); } - + } - Comparator nodeComparator = Comparator.comparingInt(o -> o.value); + Comparator nodeComparator = Comparator.comparingInt(o -> o.frequency); Queue priorityQueue = new PriorityQueue<>(nodeComparator); - for (Map.Entry m : map.entrySet()) { + for (Map.Entry m : frequencyMap.entrySet()) { priorityQueue.add(new TreeNode(m.getKey(), m.getValue())); } while (priorityQueue.size() > 1) { - TreeNode temp1 = priorityQueue.remove(); - TreeNode temp2 = priorityQueue.remove(); - TreeNode node; - node = new TreeNode(temp1.value + temp2.value, temp1, temp2); - priorityQueue.add(node); + TreeNode left = priorityQueue.remove(); + TreeNode right = priorityQueue.remove(); + priorityQueue.add(new TreeNode(left.frequency + right.frequency, left, right)); } root = priorityQueue.remove(); } - private void traverse(TreeNode temp, String w) { + private void traverse(TreeNode temp, String code) { if (temp.left == null && temp.right == null) - codeBook.put(temp.key, w); - if (temp.left != null) traverse(temp.left, w + 0); - if (temp.right != null) traverse(temp.right, w + 1); + codeBook.put(temp.letter, code); + if (temp.left != null) traverse(temp.left, code + 0); + if (temp.right != null) traverse(temp.right, code + 1); } @@ -84,27 +82,27 @@ private void CodeBookReverse() { public String encode() { traverse(root, ""); - String enc = ""; - for (int i = 0; i < s.length(); i++) { - String k = Character.toString(s.charAt(i)); - enc += codeBook.get(k); + StringBuilder encode = new StringBuilder(); + for (int i = 0; i < stringToEncode.length(); i++) { + String k = Character.toString(stringToEncode.charAt(i)); + encode.append(codeBook.get(k)); } printCodeBook(); - return enc; + return encode.toString(); } - public String decode(String enc) { - String dec = "", key = ""; + public String decode(String encoded) { + StringBuilder decoded = new StringBuilder(), key = new StringBuilder(); CodeBookReverse(); - for (int i = 0; i < enc.length(); i++) { - key = key + enc.charAt(i); - if (reverseCodeBook.containsKey(key)) { - dec = dec + reverseCodeBook.get(key); - key = ""; + for (int i = 0; i < encoded.length(); i++) { + key = key.append(encoded.charAt(i)); + if (reverseCodeBook.containsKey(key.toString())) { + decoded.append(reverseCodeBook.get(key.toString())); + key = new StringBuilder(); } } - return dec; + return decoded.toString(); } @@ -113,8 +111,7 @@ public String decode(String enc) { class Huffman { public static void main(String[] args) { - String s = "bibbity_bobbity"; - HuffmanTree huffmanTree = new HuffmanTree(s); + HuffmanTree huffmanTree = new HuffmanTree("bibbity_bobbity"); huffmanTree.createTree(); String encoded = huffmanTree.encode(); System.out.println("Encoded String: " + encoded); From 25f3014866a7fa8c37f2e9d6913031c9dd766a76 Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 14:13:59 +0530 Subject: [PATCH 5/6] Update huffman.java --- .../huffman/code/java/huffman.java | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/chapters/data_compression/huffman/code/java/huffman.java b/chapters/data_compression/huffman/code/java/huffman.java index 8bb39c3da..63ceff43a 100644 --- a/chapters/data_compression/huffman/code/java/huffman.java +++ b/chapters/data_compression/huffman/code/java/huffman.java @@ -1,4 +1,3 @@ - import java.util.*; class TreeNode { @@ -16,7 +15,6 @@ public TreeNode(int frequency, TreeNode left, TreeNode right) { this.left = left; this.right = right; } - } class HuffmanTree { @@ -38,32 +36,31 @@ public void createTree() { int frequency = frequencyMap.get(key) + 1; frequencyMap.replace(key, frequency); } - } - - Comparator nodeComparator = Comparator.comparingInt(o -> o.frequency); - - Queue priorityQueue = new PriorityQueue<>(nodeComparator); + Queue priorityQueue = new PriorityQueue<>(Comparator.comparingInt(o -> o.frequency)); for (Map.Entry m : frequencyMap.entrySet()) { priorityQueue.add(new TreeNode(m.getKey(), m.getValue())); } - - while (priorityQueue.size() > 1) { TreeNode left = priorityQueue.remove(); TreeNode right = priorityQueue.remove(); priorityQueue.add(new TreeNode(left.frequency + right.frequency, left, right)); } root = priorityQueue.remove(); - } - private void traverse(TreeNode temp, String code) { - if (temp.left == null && temp.right == null) - codeBook.put(temp.letter, code); - if (temp.left != null) traverse(temp.left, code + 0); - if (temp.right != null) traverse(temp.right, code + 1); - + private void traverse(TreeNode node, StringBuilder code) { + if (node.left == null && node.right == null) { + codeBook.put(node.letter, code.toString()); + } + if (node.left != null) { + traverse(node.left, code.append(0)); + code.deleteCharAt(code.length() - 1); + } + if (node.right != null) { + traverse(node.right, code.append(1)); + code.deleteCharAt(code.length() - 1); + } } public void printCodeBook() { @@ -81,7 +78,7 @@ private void CodeBookReverse() { } public String encode() { - traverse(root, ""); + traverse(root, new StringBuilder()); StringBuilder encode = new StringBuilder(); for (int i = 0; i < stringToEncode.length(); i++) { String k = Character.toString(stringToEncode.charAt(i)); @@ -94,7 +91,6 @@ public String encode() { public String decode(String encoded) { StringBuilder decoded = new StringBuilder(), key = new StringBuilder(); CodeBookReverse(); - for (int i = 0; i < encoded.length(); i++) { key = key.append(encoded.charAt(i)); if (reverseCodeBook.containsKey(key.toString())) { @@ -104,19 +100,14 @@ public String decode(String encoded) { } return decoded.toString(); } - - } class Huffman { - public static void main(String[] args) { HuffmanTree huffmanTree = new HuffmanTree("bibbity_bobbity"); huffmanTree.createTree(); String encoded = huffmanTree.encode(); System.out.println("Encoded String: " + encoded); System.out.println("Decoded String: " + huffmanTree.decode(encoded)); - - } } From 1b9966923443f112f6b8977fb1f1b0ff5912f7cf Mon Sep 17 00:00:00 2001 From: Sklan Date: Sat, 30 Jun 2018 21:43:11 +0530 Subject: [PATCH 6/6] Added java in huffman.md --- chapters/data_compression/huffman/huffman.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapters/data_compression/huffman/huffman.md b/chapters/data_compression/huffman/huffman.md index 66d5f376c..e397f1b42 100644 --- a/chapters/data_compression/huffman/huffman.md +++ b/chapters/data_compression/huffman/huffman.md @@ -84,9 +84,11 @@ Program.cs {% sample lang="js" %} ### JavaScript [import, lang:"javascript"](code/javascript/huffman.js) +{% sample lang="java" %} +### Java +[import, lang:"java"](code/java/huffman.java) {% endmethod %} -