无损压缩算法 Java
简介
无损压缩算法是一种能够减小文件大小而保持数据完整性的算法。在计算机科学领域,我们经常需要处理大量的数据,而这些数据可能会占用很大的存储空间。无损压缩算法通过对数据进行编码和解码的方式,能够在不丢失任何信息的情况下,将数据的大小减小到最小。
Java 是一种功能强大的编程语言,拥有丰富的库和工具,可以用来实现各种无损压缩算法。本文将介绍一些常见的无损压缩算法,并使用 Java 代码提供示例。
常见的无损压缩算法
Huffman 压缩算法
Huffman 压缩算法是一种基于字符出现频率的压缩方法。它通过构建一个 Huffman 树来生成一种特殊的编码,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示。这样可以大大减小表示数据所需的位数。
以下是一个使用 Huffman 压缩算法的 Java 代码示例:
import java.util.PriorityQueue;
class HuffmanNode implements Comparable<HuffmanNode> {
int data;
char c;
HuffmanNode left;
HuffmanNode right;
public int compareTo(HuffmanNode node) {
return data - node.data;
}
}
class HuffmanCompressor {
public static void compress(String data) {
int[] freq = new int[256];
for (char c : data.toCharArray()) {
freq[c]++;
}
PriorityQueue<HuffmanNode> pq = new PriorityQueue<>();
for (int i = 0; i < 256; i++) {
if (freq[i] > 0) {
HuffmanNode node = new HuffmanNode();
node.c = (char) i;
node.data = freq[i];
pq.offer(node);
}
}
while (pq.size() > 1) {
HuffmanNode left = pq.poll();
HuffmanNode right = pq.poll();
HuffmanNode parent = new HuffmanNode();
parent.data = left.data + right.data;
parent.left = left;
parent.right = right;
pq.offer(parent);
}
HuffmanNode root = pq.poll();
printCodes(root, "");
}
public static void printCodes(HuffmanNode node, String code) {
if (node.left == null && node.right == null && Character.isLetter(node.c)) {
System.out.println(node.c + ": " + code);
return;
}
printCodes(node.left, code + "0");
printCodes(node.right, code + "1");
}
}
public class Main {
public static void main(String[] args) {
String data = "Hello, World!";
HuffmanCompressor.compress(data);
}
}
LZW 压缩算法
LZW 压缩算法是一种基于字典的压缩方法。它维护一个字典,将输入数据中的短字符串映射到唯一的编码。在压缩过程中,如果遇到新的字符串,就将它添加到字典中,并为它分配一个新的编码。在解压过程中,通过读取编码并查找字典,可以将编码还原为原始字符串。
以下是一个使用 LZW 压缩算法的 Java 代码示例:
import java.util.HashMap;
import java.util.Map;
class LZWCompressor {
public static void compress(String data) {
Map<String, Integer> dictionary = new HashMap<>();
for (int i = 0; i < 256; i++) {
dictionary.put(Character.toString((char) i), i);
}
StringBuilder compressedData = new StringBuilder();
String current = "";
int code = 256;
for (char c : data.toCharArray()) {
String combined = current + c;
if (dictionary.containsKey(combined)) {
current = combined;
} else {
compressedData.append(dictionary.get(current)).append(" ");
dictionary.put(combined, code++);
current = Character.toString(c);
}
}
if (!current.equals("")) {
compressedData.append(dictionary.get(current));
}
System.out.println(compressedData.toString());
}
}
public class Main {
public static void main(String[] args) {
String data = "ABABABA";
LZWCompressor.compress(data);
}
}