-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathHuffmanCoding.java
More file actions
143 lines (112 loc) · 4.25 KB
/
HuffmanCoding.java
File metadata and controls
143 lines (112 loc) · 4.25 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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import java.io.*;
import java.util.*;
class HuffmanNode {
int frequency;
char character;
HuffmanNode left;
HuffmanNode right;
}
class HuffmanComparator implements Comparator<HuffmanNode> {
public int compare(HuffmanNode node1, HuffmanNode node2) {
return node1.frequency - node2.frequency;
}
}
public class HuffmanCoding {
private Map<Character, String> huffmanCodes;
public String compress(String input) {
huffmanCodes = buildHuffmanCodes(input);
StringBuilder compressedString = new StringBuilder();
// Converter a sequência de entrada em uma sequência compactada usando os
// códigos de Huffman
for (char c : input.toCharArray()) {
compressedString.append(huffmanCodes.get(c));
}
return compressedString.toString();
}
public String decompress(String compressedString) {
StringBuilder decompressedString = new StringBuilder();
StringBuilder currentCode = new StringBuilder();
for (char c : compressedString.toCharArray()) {
currentCode.append(c);
for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
if (entry.getValue().equals(currentCode.toString())) {
decompressedString.append(entry.getKey());
currentCode.setLength(0);
break;
}
}
}
return decompressedString.toString();
}
private Map<Character, String> buildHuffmanCodes(String input) {
Map<Character, String> huffmanCodes = new HashMap<>();
// Calcular a frequência de cada caractere
Map<Character, Integer> frequencyMap = new HashMap<>();
for (char c : input.toCharArray()) {
frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
}
// Criar uma fila de prioridade para armazenar os nós
PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<>(new HuffmanComparator());
// Criar um nó para cada caractere e adicioná-lo à fila de prioridade
for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
HuffmanNode node = new HuffmanNode();
node.character = entry.getKey();
node.frequency = entry.getValue();
node.left = null;
node.right = null;
priorityQueue.add(node);
}
// Construir a árvore de Huffman
while (priorityQueue.size() > 1) {
HuffmanNode left = priorityQueue.poll();
HuffmanNode right = priorityQueue.poll();
HuffmanNode parentNode = new HuffmanNode();
parentNode.character = '\0';
parentNode.frequency = left.frequency + right.frequency;
parentNode.left = left;
parentNode.right = right;
priorityQueue.add(parentNode);
}
// Gerar os códigos de Huffman recursivamente
if (!priorityQueue.isEmpty()) {
HuffmanNode rootNode = priorityQueue.peek();
generateHuffmanCodes(rootNode, "", huffmanCodes);
}
return huffmanCodes;
}
private void generateHuffmanCodes(HuffmanNode node, String code, Map<Character, String> huffmanCodes) {
if (node == null) {
return;
}
if (node.character != '\0') {
huffmanCodes.put(node.character, code);
}
generateHuffmanCodes(node.left, code + "0", huffmanCodes);
generateHuffmanCodes(node.right, code + "1", huffmanCodes);
}
public void writeCompressedFile(String compressedString) {
try {
FileWriter fileWriter = new FileWriter("baseHuffmanCompressao" + Main.version + ".txt");
BufferedWriter writer = new BufferedWriter(fileWriter);
writer.write(compressedString);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String readCompressedFile(int version) {
StringBuilder compressedString = new StringBuilder();
try {
FileReader fileReader = new FileReader("baseHuffmanCompressao" + version + ".txt");
BufferedReader reader = new BufferedReader(fileReader);
String line;
while ((line = reader.readLine()) != null) {
compressedString.append(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return compressedString.toString();
}
}