forked from rituburman/hacktoberfest2020
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHuffmanEncoder.java
More file actions
73 lines (71 loc) · 1.89 KB
/
HuffmanEncoder.java
File metadata and controls
73 lines (71 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.ArrayList;
import java.util.HashMap;
import java.util.PriorityQueue;
public class HuffmanEncoder {
private HashMap<Character, String> encoder=new HashMap<>();
private HashMap<String, Character> decoder=new HashMap<>();
private class Node implements Comparable<Node>{
char data;
int freq;
Node left;
Node right;
@Override
public int compareTo(Node o) {
return this.freq-o.freq;
}
}
public HuffmanEncoder(String feeder) {
HashMap<Character, Integer> fmap=new HashMap<>();
for(int i=0;i<feeder.length();i++){
char ch=feeder.charAt(i);
fmap.put(ch, fmap.containsKey(ch)?fmap.get(ch)+1:1);
}
ArrayList<Character> keys=new ArrayList<>(fmap.keySet());
PriorityQueue<Node> pq=new PriorityQueue<>();
for(char key:keys){
Node node=new Node();
node.data=key;
node.freq=fmap.get(key);
pq.add(node);
}
while(pq.size()>1){
Node one=pq.remove();
Node two=pq.remove();
Node merge=new Node();
merge.freq=one.freq+two.freq;
merge.left=one;
merge.right=two;
pq.add(merge);
}
Node root=pq.remove();
traverse(root,"");
}
private void traverse(Node node, String psf) {
if(node.left==null&&node.right==null){
encoder.put(node.data, psf);
decoder.put(psf, node.data);
return;
}
traverse(node.left, psf+"0");
traverse(node.right, psf+"1");
}
public String Encode(String str){
String code="";
for(int i=0;i<str.length();i++){
code+=encoder.get(str.charAt(i));
}
return code;
}
public String Decode(String str){
String decode="";
String prefix="";
for(int i=0;i<str.length();i++){
prefix+=str.charAt(i);
if(decoder.containsKey(prefix)){
decode+=decoder.get(prefix);
prefix="";
}
}
return decode;
}
}