winRAR真难用,我决定自创一个(结丹期) HuffmanTree

 结丹期简介

结丹期主要阐述的是对哈夫曼树思路分析创建分析

提供完整代码,代码在筑基期中     

博主空间https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343强哥的查找算法https://blog.csdn.net/JOElib/article/details/123848806?spm=1001.2014.3001.5501

哈夫曼树

目录

哈夫曼树(huffman)的创建思想😀:

哈夫曼树的代码实现与分析🥸:

创建一个节点类  

代码分析:

创建一个HuffmanTree(哈夫曼树类)

代码分析:

创建一个创建哈夫曼树的方法 

代码分析:

结论


 哈夫曼树(huffman)的创建思想😀:

  1.  将列表从小到大的进行排序
  2.  将列表中的最小权的子树(节点)取出
  3.  将这两个子树创建成一个新子树,新子树的根节点的权等于这两个子树的权之和
  4.  将新的子树放回列表中,重新进行上述操作,直到形成一个哈夫曼树

哈夫曼树的代码实现与分析🥸:

创建一个节点类  

public class Node implements Comparable<Node>{
    public int value;
    public Node left;
    public Node right;

    public Node(int value) {
        this.value = value;
    }

    public String toString() {
        return value + "";
    }

    public int compareTo(Node node) {
        return value - node.value;
    }
}

代码分析:

  1. 属性: value代表的是节点的权,left和right分别表示左子节点和右子节点
  2. 构造方法: 用于初始化节点
  3. toString方法: 方便输出节点,里面有一个字符串拼接的操作哦
  4. 实现Comparable接口: 由于思路中有提及需要进行排序的操作,所以节点类要实现Comparable接口,并实现compareTo方法
    1. compareTo方法,如果返回值是value - node.value 则表示从小到大,反之,从大到小

创建一个HuffmanTree(哈夫曼树类)

public class HuffmanTree {
}

代码分析:

创建一个创建哈夫曼树的方法 

该方法的目的是将一个数组的数据变成一颗哈夫曼树 

public static Node create(int[] array) {
        var nodes = new ArrayList<Node>(array.length);
        for(var item : array) {
            nodes.add(new Node(item));
        }
        while (nodes.size() > 1) {
            Collections.sort(nodes);
            var left = nodes.get(0);
            var right = nodes.get(1);
            var parent = new Node(left.value + right.value);
            parent.left = left;
            parent.right = right;
            nodes.remove(1);
            nodes.remove(0);
            nodes.add(parent);
        }
        return nodes.get(0);
    }

代码分析:

  1.  我们先创建一个集合,并指定泛型为Node,构造方法中指定集合的大小,即数组的长度   array.length
  2.  遍历数组,用增强for循环,将数组里面的元素放入构造方法中,将new出来的节点对象放入集合中
    1. 没有集合的后果
      1. 如果没有集合,直接用数组对节点类进行排序是困难的,不方便
      2. 而且直接用数组进行取节点操作的时候还得考虑覆盖的情形,效率极低
    2. 集合的好处
      1. 相关工具类中有排序的方法,方便我们去调用和管理
      2. 我们不需要考虑底层覆盖问题,直接取出即可
  3. 根据思路,
    1. 先对集合进行排序,即Collection.sort(list)操作
    2. 再将最小的两个权的子树取出.即get(0),get(1),分别放入left和right辅助引用中
    3. 创建一个新节点,即新的根节点parent,其权的值等于刚取出来的权值之和
    4. 把新的根节点的左右节点分别于取出来的子树挂上
    5. 注意:由于前面两颗子树已经被取走,理论上已经不存在了,但是实际代码上没做出对应操 作时仍然存在,所以我们要调用remove()方法去删除
      1. 注意:一定要先删除下标为1的节点后删除下标为0的节点,否则最后一次删除会出现异常
      2. 最后一次第一个节点被删除,只剩下一个节点,没有下标为1的节点了
    6. 将新的父节点添加到集合中
  4. 循环执行步骤3,如果集合中只剩下最后一个元素的时候,说明哈夫曼树已经完成,可以结束循环,即list.size()>0

结论

        哈夫曼树是真个压缩软件的核心部件,大家一定要学会哦 

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇土著、JOElib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值