- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHuffmanCoder.java
More file actions
Latest commit
111 lines (91 loc) · 3.19 KB
/
Copy pathHuffmanCoder.java
File metadata and controls
111 lines (91 loc) · 3.19 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
importjava.util.*;
importBasicMaths.primeOrNot;
publicclassHuffmanCoder {
privateHashMap<String, Character> decoder;
privateHashMap<Character, String> encoder;
privateclassNodeimplementsComparable<Node> {
intcost ;
Charactertext ;
Nodeleft ;
Noderight;
Node(Charactertext , intcost){
this.text=text;
this.cost = cost ;
this.left=null;
this.right=null;
}
@Override
publicintcompareTo(Nodeother) {
returnthis.cost - other.cost;
}
}
// Constructor
publicHuffmanCoder(Stringfeeder) {
// Step 1: Frequency map
HashMap <Character,Integer> fmap = newHashMap<>();
for (Characterch : feeder.toCharArray()) {
fmap.put(ch, fmap.getOrDefault(ch, 0)+1);
}
// Step 2: Min heap (Priority Queue)
PriorityQueue<Node> priorityQueue = newPriorityQueue<>();
for (Map.Entry<Character , Integer> entry : fmap.entrySet() ) {
priorityQueue.add(newNode(entry.getKey(), entry.getValue()));
}
// Step 3: Build Huffman Tree
while (priorityQueue.size() > 1) {
NodeleftNode = priorityQueue.poll();
NoderightNode = priorityQueue.poll();
NodenewNode = newNode('\0', leftNode.cost+rightNode.cost);
newNode.left= leftNode;
newNode.right= rightNode;
priorityQueue.add(newNode);
}
Noderoot = priorityQueue.poll();
// Step 4: Generate encoder & decoder
encoder = newHashMap<>();
decoder= newHashMap<>();
buildEncoderDecoder(root, "");
}
privatevoidbuildEncoderDecoder(Nodenode, Stringcode) {
if (node==null)
return ;
if (node.left == null && node.right== null) {
if (code.length()==0) code ="0";
encoder.put(node.text , code);
decoder.put(code , node.text);
}
buildEncoderDecoder(node.left, code + "0");
buildEncoderDecoder(node.right, code + "1");
}
// Encode text → binary string
publicStringencode(Stringsource) {
StringBuildersb = newStringBuilder();
for (Characterch : source.toCharArray()) {
sb.append(encoder.get(ch));
}
returnsb.toString();
}
// Decode binary string → original text
publicStringdecode(StringcodedString) {
StringBuilderans = newStringBuilder();
Stringkey ="";
for (charch : codedString.toCharArray()) {
key +=ch;
if (decoder.containsKey(key)) {
ans.append(decoder.get(key));
key="";
}
}
returnans.toString();
}
// Test / Demo
publicstaticvoidmain(String[] args) {
Stringtext = "hello huffman";
HuffmanCodercoder = newHuffmanCoder(text);
Stringencoded = coder.encode(text);
Stringdecoded = coder.decode(encoded);
System.out.println("Original: " + text);
System.out.println("Encoded Bits: " + encoded);
System.out.println("Decoded Back: " + decoded);
}
}