原理:来源于信息论中的Huffman coding,利用字符在文本文件中出现的频率构造异字头的平均长度最短的码字,有时也被称之为最佳编码。
构建哈夫曼树的步骤:
将字符出现的概率按从大到小进行排列, 把最小的两个概率相加,作为一个新的概率与其他的概率重新进行排序,直到最后仅剩一个概率且为1。每次相加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”, 将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的赫夫曼编码。
Java代码实现:
1,压缩部分:
构造器:
创建三个哈希表,前两个用于对字符的出现频率和后续的哈夫曼编码进行记录,第三个则用来构建哈夫曼树的时候,方便对于代表概率的Node进行整合处理。同时为了方便比较压缩与解压之后的文件是否一致,选择将压缩后的文本存储在另一个文本文件中。
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Compress {
HashMap<String, String> corrcode = new HashMap<>();
HashMap<Character, Double> prob = new HashMap<>();
HashMap<Node, Double> nodeList = new HashMap<>();
Node root;
File file;
File outfile;
class Node {
Node left;
Node right;
String data;
String code;
Double num;
}
}
读取文本文件:
public String readFile(String path) throws Exception {
file = new File(path);
FileReader filereader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(file