-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHuffmanEncoding.java
More file actions
111 lines (93 loc) · 2.51 KB
/
HuffmanEncoding.java
File metadata and controls
111 lines (93 loc) · 2.51 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
import java.util.*;
class HuffmanEncoding {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String str = in.next();
int[] freqs = new int[256];
for(int i = 0; i < str.length(); i++)
freqs[(int)str.charAt(i)]++;
HuffmanTree tree = new HuffmanTree(freqs);
String encoded = "";
for(int i = 0; i < str.length(); i++)
encoded += tree.leaves.get(str.charAt(i)).code;
System.out.println(tree.inOrderLeaves.size() + " " + encoded.length());
while(!tree.inOrderLeaves.isEmpty()){
TreeNode leaf = tree.inOrderLeaves.poll();
System.out.println(leaf.character + ": " + leaf.code);
}
System.out.println(encoded);
}
}
class HuffmanTree {
TreeNode root;
HashMap<Character, TreeNode> leaves;
LinkedList<TreeNode> inOrderLeaves;
public HuffmanTree(int[] freqs){
this.leaves = new HashMap<Character, TreeNode>();
this.inOrderLeaves = new LinkedList<TreeNode>();
PriorityQueue<TreeNode> pq
= new PriorityQueue<TreeNode>(11, new TreeNodeComp());
for(int i = 0; i < freqs.length; i++){
if(freqs[i] != 0){
TreeNode node = new TreeNode((char)i, freqs[i]);
leaves.put(node.character, node);
inOrderLeaves.add(node);
pq.add(node);
}
}
if(pq.size() == 1){
TreeNode node = pq.poll();
node.code = "0";
this.root = node;
return;
}
while(pq.size() > 1) {
TreeNode node1 = pq.poll();
TreeNode node2 = pq.poll();
TreeNode newNode = new TreeNode(node1.character, node1.freq + node2.freq);
newNode.c0 = node1;
newNode.c1 = node2;
node1.parent = newNode;
node2.parent = newNode;
pq.add(newNode);
}
this.root = pq.poll();
for(TreeNode node : inOrderLeaves)
node.code = getCode(node.character);
}
public String getCode(char c){
if(leaves.get(c) == null)
return null;
String code = "";
TreeNode node = leaves.get(c);
while(node != root){
if(node == node.parent.c0)
code = "0" + code;
if(node == node.parent.c1)
code = "1" + code;
node = node.parent;
}
return code;
}
}
class TreeNode {
char character;
int freq;
String code;
TreeNode parent;
TreeNode c0;
TreeNode c1;
public TreeNode(char character, int freq){
this.character = character;
this.freq = freq;
String code = new String();
c0 = null;
c1 = null;
parent = null;
}
}
class TreeNodeComp implements Comparator<TreeNode>{
public int compare(TreeNode first, TreeNode second){
return first.freq - second.freq;
}
}