Java 霍夫曼编码(Huffman Coding)

本文介绍了使用Java实现霍夫曼编码的详细步骤,通过创建节点类存储权重、父节点和儿子节点信息,并利用旗标避免重复选取已用节点。在生成霍夫曼树后,不需遍历整树即可获取指定字符的编码,而是通过从目标节点向上查找父节点的路径得到编码。具体实现过程以代码形式展示。
摘要由CSDN通过智能技术生成

霍夫曼编码的具体步骤如下

1)将信源符号的概率按减小的顺序排队。

2)把两个最小的概率相加,并继续这一步骤,始终将较高的概率分支放在右边,直到最后变成概率1。

3)画出由概率1处到每个信源符号的路径,顺序记下沿路径的0和1,所得就是该符号的霍夫曼码字。   

4)将每对组合的左边一个指定为0,右边一个指定为1(或相反)
  1. 思路:一个节点类包括权重,父亲左儿子,右儿子节点,flag 的false表示已经使用过了,下次找两个最小的不会再找这个false掉的了,parentPath表示儿子到父亲的路径上的数字,左边为0,右边为1(我这个里面设置了左边儿子比右边儿子小),存储哈夫曼节点;然后一个list存储刚输入的码的权重生成的节点,每次查找flag为true的两个最小的权重的节点,生成父节点,设置相关节点的属性值;最后输出编码,不用遍历树,直接找到要编码的码,然后一路向上查找parentPath的值就是编码的倒序,故采用栈来保存,最后输出编码就是正确的编码格式。
  2. 话不多说,上代码:
package com.leibobo;

/**
 * Created by bobolei 18/4/13
 *哈夫曼节点定义
 */

public class NodeHuffman {
   

    //权重,标志位,父节点,左右儿子
    //flag = false表示还没有进行合并,即还是一个没有归类的节点
    //创建树的过程中直接标记哈夫曼编码,根节点父路劲为-1,其他父路径自己是左儿子,则为0,右儿子,则为1,后面直接找到要编码的数,向上查找即是哈夫曼编码的反路劲,翻转即可。。。哈哈哈哈,我号机智
    private int weight;
    private boolean flag; //默认false
    private int parentPath;  //默认是0
    public int getParentPath() {
        return parentPath;
    }

    public void setParentPath(int parentPath) {
        this.parentPath = parentPath;
    }

    private NodeHuffman parent,lChild,rChild;

    public NodeHuffman(){

    }

    public NodeHuffman(int weight){
        this.weight = weight;
        flag = true;
        parent = lChild = rChild = null;
    }

    public int getWeight() {
        return weight;
    }

    public
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值