-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathHuffman.java
More file actions
114 lines (98 loc) · 2.83 KB
/
Copy pathHuffman.java
File metadata and controls
114 lines (98 loc) · 2.83 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
112
113
114
import java.util.HashMap;
import java.util.Map;
import java.util.Comparator;
public class Huffman {
public String givenString;
public String stringAfterCoding;
public String stringBeforeCoding;
public HashMap<Character, Integer> characterToFrequency;
public HashMap<Character, String> characterToCode;
public HashMap<String, Character> codeToCharacter;
private priorityQueue<node> priorityQueue;
public int sizeOfHuffManTree;
public node root;
public Huffman(String givenString, String dotfilename) {
this.sizeOfHuffManTree = 0;
this.givenString = givenString;
characterToFrequency = new HashMap<Character, Integer>();
characterToCode = new HashMap<Character, String>();
codeToCharacter = new HashMap<String, Character>();
priorityQueue = new priorityQueue<node>(givenString.length(), new Comparator<node>() {
@Override
public int compare(node node1, node node2) {
if (node1.weight < node2.weight)
return -1;
else if (node1.weight > node2.weight)
return 1;
return 0;
}
});
numberofWords();
buildTree();
buildCodeTable();
}
public HashMap<String, Character> rCodeToCharacter() {
return codeToCharacter;
}
public HashMap<Character, String> rCharacterToCode() {
return characterToCode;
}
private void numberofWords() {
Character character;
Integer weight;
for (int i = 0; i < givenString.length(); i++) {
character = givenString.charAt(i);
if (characterToFrequency.get(character) == null)
weight = 1;
else
weight = characterToFrequency.get(character) + 1;
characterToFrequency.put(character, weight);
}
}
private void buildCodeTable() {
String code = "";
node node = root;
buildCodeRecursion(node, code);
}
private void buildCodeRecursion(node node, String code) {
if (node != null) {
if (!checkIfLeafOrNot(node)) {
buildCodeRecursion(node.left, code + '0');
buildCodeRecursion(node.right, code + '1');
} else {
characterToCode.put(node.character, code);
codeToCharacter.put(code, node.character);
}
}
}
private void buildTree() {
buildHeap();
node left, right;
while (priorityQueue != null) {
left = priorityQueue.serve();
sizeOfHuffManTree++;
if (priorityQueue.retrieve() != null) {
right = priorityQueue.serve();
sizeOfHuffManTree++;
root = new node('\0', left.weight + right.weight, left, right);
}
if (priorityQueue.retrieve() != null) {
priorityQueue.insert(root);
} else {
sizeOfHuffManTree++;
break;
}
}
}
private void buildHeap() {
for (Map.Entry<Character, Integer> entry : characterToFrequency.entrySet()) {
Character character = entry.getKey();
Integer weight = entry.getValue();
node node = new node(character, weight);
priorityQueue.insert(node);
}
}
public boolean checkIfLeafOrNot(node node) {
return (node.left == null) && (node.right == null);
}
}