霍夫曼编码和解码

本文介绍了霍夫曼编码的过程,包括统计字符频率、构建霍夫曼树、生成二进制编码以及如何进行编码和解码。特别强调了该方法适用于ASCII码内的字符,对于多字节字符可能会遇到问题。
摘要由CSDN通过智能技术生成

编码步骤:
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) {
        // 根据字符串中不同字符出现次数作为权值构造霍夫曼树
        // 根据霍夫曼树求出每个字符的对应编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值