哈夫曼树(最优二叉树)

哈夫曼树是一种带权路径长度最小的二叉树,常用于数据压缩和通信中的编码。通过构建哈夫曼树,可以实现字符的不等长编码,频率高的字符编码短,频率低的字符编码长,确保最短的传输报文长度。例如,字符a到g的权重分别为3, 24, 6, 20, 34, 4, 12,对应编码为a:10110, b:01, c:1010, d:00, e:11, f:10111, g:100。建树过程是从所有叶子节点中选择最小权重的节点组合,直至只剩下一个节点。" 105017285,9392696,深入解析:DHCP服务器工作原理与配置,"['网络', '协议', '配置教程']
摘要由CSDN通过智能技术生成

给定N个权值作为N个叶子节点,构造一个二叉树,带权路径长度总和最小,这样二叉树称做哈夫曼树,又称做最优二叉树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

哈夫曼编码

数据通信中,需要将传输的文字转为二进制的字符串,为了使编码后字符串尽可能端,在不等长编码中,可以让使用频率高的字符用短码,频率低的字符使用长码。
为了使不等长编码为前缀编码(要求一个字符的编码不能是另一个字符的编码的前缀),可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度效果上就是传送报文的最短长度。

哈夫曼树

假如对于字符a,b,c,d,e,f,g的权重分别是3,24,6,20,34,4,12。则对应的哈夫曼树如下图:
在这里插入图片描述
根据上边的哈夫曼树,可以得到个字符对应的编码为:
a:10110
b:01
c:1010
d:00
e:11
f:10111
g:100
建树思路

  1. 每次选取所有叶子节点中权重最小的两个节点,组成一棵子树;
  2. 移除原有的两个节点
  3. 将新生成的子树插入序列中
  4. 重复上述步骤,直到集合中只有一个节点
    生成树结构
// 节点对象
private class Node implements Comparable<Node>{
   
    private T data;
    // 权重
    int weight;
    Node parent, left, right;

    public Node(T data, int weight) {
   
        this.data = data;
        this.weight = weight;
    }

    @Override
    public int compareTo(@NotNull Node o
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值