编码步骤:
1、准备待编码的字符串(可以从文本文件中读取不包含中文)。
2、统计字符串中每个字符出现的次数。(设置一个长度为256的数组,使用字符对应的ASCII码作为数组下标,保存次数。如:array[‘a’]=10;表示字符a出现10次。)
3、根据上面的数组,生成节点。(每个字符对应一个节点,以链表形式链接起来,同时链表按从小到大排序。)
4、构造霍夫曼树。每次删除链表中的两个节点,生成一个新节点。并将这个节点重新插入到链表合适位置。(构造霍夫曼树参考:打开)。霍夫曼树解码时需要使用。
5、通过前序遍历,求出每个字符的二进制编码。同样设置一个长度为256的数组,下标为字符对应的ASCII码。没出现的字符编码为null,不考虑。
6、根据求出的二进制编码替换原来的每个字符。得到整个字符串对应的二进制编码。
7、将二进制编码按照每8位生成一个新字符。最后剩的不足8位的在后面补上count个0,计算一个新字符。补0的个数解码时需要使用。
8、将这些生成的新字符替换掉二进制编码字符串,即可得到编码后的内容。长度将在一定程度上变短。
public class Node {
// 既是树的节点也是链表的节点
public int data; // 存的字符0-255
public int weight;
public Node lchild;
public Node rchild;
public Node next; // 用于链表
public Node(int d, int w) {
data = d;
weight = w;
lchild = rchild = next = null;
}
}
public class HuffmanCode {
public static int count = 0;
public static Node head = null;
public static void main(String[] args) {
String t = code("youareagoodboy");
String r = decode(t);
System.out.println(r);
}
// 对任意字符串进行霍夫曼编码
public static String code(String str) {
// 根据字符串中不同字符出现次数作为权值构造霍夫曼树
// 根据霍夫曼树求出每个字符的对应编码