算法学习之最优二叉树(赫夫曼树)

最优二叉树—哈夫曼(huffman)树 哈夫曼树又称最优二叉树,是一类带权路径长度最短的二叉树,有着广泛的应用。基本概念权:将树中的结点赋上一个有着某种意义的数值路径:从A结点道B结点所经过的分支序列路径长度:从A结点道B结点所经过的分支数目查找效率平均查找长度(ASL)取决于树的高度ASL=(1+2*2+3)/4=2 ASL=(1+2+3... 阅读详情

概念

  • 给定n个权值作为n个叶子节点,构造一颗二叉树,若该数的代全路径长度(wpl)达到最小,称这样的的二叉树为最优二叉树,也成霍夫曼树

  • 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较近

  • 路径和路径长度:

    • 在一棵树中,从一个结点往下可以达到的孩子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根节点到L层结点的路径长度为L-1

  • 结点的权及带权路径长度:

    • 若将树中结点赋给一个有着某种含义的数值,则这个数值成为该节点的权。结点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积

  • 树的带权路径长度:树的带权路径长度规定为所有叶子节点的带权路径长度之和,记为WPL(weighted path length),权值越大的节点离根节点越近。

原理

因为带权路径长度是权值*路径长度,要使带权路径长度最小,节点的权值越大,其路径长度就要越小

  • 给定一个序列,将其从小到大排序,这样我们序列的前两个就是权值最小的两个元素

  • 创建一个新的节点,其权值为权值最小的两个元素的权值之和,然后将这两个最小元素,分别放到新节点的左右子节点上,并将新节点的权值放回序列,代替原来的两个元素

  • 重新排序后重复上述操作,直到序列中只剩一个节点,即构建完毕

  • 这样创建出的赫夫曼树的根结点为所有节点的权值之和,根结点的两个子节点是最大节点与其他节点的权值之和构建的新节点,以此类推,权值越大,越靠近根结点,路径越短

赫夫曼编码

  • 赫夫曼编码是哈夫曼树在电讯通信中的经典应用之一

  • 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常都在20%~90%之间

  • 赫夫曼码是可变字长编码的一种

  • 构建好赫夫曼树后,按照左0右1的规则生成编码,因为生成的赫夫曼树后,每个编码都是叶子节点,所以不会产生有两个编码有同样前缀的情况(即每个编码的父节点都不可能是另一个编码),即赫夫曼编码是前缀编码

代码

class  HuffNode implements Comparable<HuffNode> {
    int value;
    HuffNode left;
    HuffNode right;
    char c;
    String huffCode;

    public HuffNode(int value, char c) {
        this.value = value;
        this.left = null;
        this.right = null;
        this.c = c;
        this.huffCode = "";
    }

    public HuffNode(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
        this.huffCode = "";
    }

    public HuffNode() {
        this.value = 0;
        this.left = null;
        this.right = null;
        this.huffCode = "";
    }

    @Override
    public String toString() {
        if (left != null && right != null) {
            return "HuffNode{ " +
                    " value=" + value +
                    " left=" + left.value +
                    " right=" + right.value +
                    " c=" + c +
                    " huffCode=" + huffCode +
                    " }";
        }else if (left != null && right == null){
            return "HuffNode{ " +
                    " value=" + value +
                    " left=" + left.value +
                    " c=" + c +
                    " huffCode=" + huffCode +
                    " }";
        }else {
            return "HuffNode{ " +
                    " value=" + value +
                    " c=" + c +
                    " huffCode=" + huffCode +
                    " }";
        }
    }

    /**
     * 先序遍历
     */
    public void preOrder() {
        System.out.println(this);
        if (this.left != null) {
            this.left.preOrder();
        }
        if (this.right != null) {
            this.right.preOrder();
        }
    }

    /**
     * 设置哈弗曼编码,路径左0右1
     * 哈弗曼编码是前缀编码的原因为:生成哈夫曼树时每个元素都为叶子节点
     * @param c 根据字符查询
     * @param code 存储路径信息,最后保存到huffCode中
     */
    public void setHuffCode(char c , String code) {

        if (this.c == c) {
            String str = "";
            for (int i = 1; i < code.length(); i++) {
                 str = str + code.charAt(i);
            }
            this.huffCode = str;
            return;
        }
        // 左0
        if (this.left != null) {
            code = code+"0";
            this.left.setHuffCode(c,code);
        }
        // 右1
        if (this.right != null) {
            code = code+"1";
            this.right.setHuffCode(c,code);
        }
    }

    /**
     * 实现Comparable接口
     * 实现方法,此为从小到大排序
     *
     * @param o
     * @return
     */
    @Override
    public int compareTo(HuffNode o) {
        return this.value - o.value;
    }
}
class HuffmaTree {

    private ArrayList<HuffNode> huffNodeArrayList ;
    private HuffNode[] arrHuff;
    private HuffNode root;


    public void setHuffNodeArrayList(ArrayList<HuffNode> huffNodeArrayList) {
        this.huffNodeArrayList = new ArrayList<HuffNode>();
        for (int i = 0 ; i < huffNodeArrayList.size() ; i++) {
            HuffNode node = huffNodeArrayList.get(i);
            this.huffNodeArrayList.add(node);
        }
    }

    public void list() {
        Iterator iterator = huffNodeArrayList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    public void setRoot(HuffNode root) {
        this.root = root;
    }

    public void preOrder() {
        if (root == null) {
            System.out.println("空");
        }else {
            root.preOrder();
        }
    }
    /**
     * 根据数组中的值放置arrHuff
     * @param arr
     */
    public void setArrHuff(int[] arr) {
        arrHuff = new HuffNode[arr.length];
        for (int i = 0 ; i < arr.length ; i++) {
            HuffNode node = new HuffNode(arr[i]);
            arrHuff[i] = node;
        }
    }

    public HuffNode[] getArrHuff() {
        return arrHuff;
    }

    public ArrayList<HuffNode> getHuffNodeArrayList() {
        return huffNodeArrayList;
    }

    /**
     * 构造哈夫曼树,所有叶子节点的带权路径之和最小的树(路径长度*权值)
     * @param arr
     * @return 返回最优二叉树的根结点
     */
    public HuffNode createHuffmanTree_2(int[] arr) {
        ArrayList<HuffNode> arrayList = new ArrayList();
        for (int value : arr) {
            arrayList.add(new HuffNode(value));
        }
        while (arrayList.size() > 1) {
            // 1. 将数组从小到大排序
            Collections.sort(arrayList);
            // 2. 选择权值最小的两个节点组成树,其根结点为两子节点权值之和
            HuffNode leftNode = arrayList.get(0);
            HuffNode rightNode = arrayList.get(1);
            HuffNode parent = new HuffNode(leftNode.value + rightNode.value);
            parent.right = rightNode;
            parent.left = leftNode;
            // 3. 将根节点权值放回数组中,并重复上述操作
            arrayList.remove(leftNode);
            arrayList.remove(rightNode);
            arrayList.add(parent);
        }
        return arrayList.get(0);
    }
    /**
     * 构造哈夫曼树,所有叶子节点的带权路径之和最小的树(路径长度*权值)
     * @param arr
     */
    public HuffNode createHuffmanTree_1(int[] arr) {
        // 1. 将数组从小到大排序
        QuickSort quickSort = new QuickSort();
        quickSort.quickSort(arr,0,arr.length-1);
        setArrHuff(arr);
        for (int i = 0 ; i < arr.length-1 ; i++) {
            // 2. 选择权值最小的两个节点组成树,其根结点为两子节点权值之和
            int value = arrHuff[i].value + arrHuff[i+1].value;
            HuffNode node = new HuffNode(value);
            node.left = arrHuff[i];
            node.right = arrHuff[i+1];
            // 3. 将根节点权值放回数组中,并重复上述操作
            arrHuff[i+1] = node;
            for (int j = i+1 ; j < arrHuff.length-1 ; j++) {
                for (int k = i+1 ; k < arrHuff.length-1 ; k++) {
                    if (arrHuff[k].value>arrHuff[k+1].value) {
                        HuffNode temp = arrHuff[k];
                        arrHuff[k] = arrHuff[k+1];
                        arrHuff[k+1] = temp;
                    }
                }
            }
        }
        return arrHuff[arrHuff.length-1];
    }

    /**
     * 构造哈夫曼树,所有叶子节点的带权路径之和最小的树(路径长度*权值)
     * @param arr
     * @return 返回最优二叉树的根结点
     */
    public HuffNode createHuffmanTree_3(int[] arr , char[] letter) {
        ArrayList<HuffNode> arrayList = new ArrayList();
        for (int i = 0 ; i < arr.length ; i++) {
            arrayList.add(new HuffNode(arr[i],letter[i]));
        }
        setHuffNodeArrayList(arrayList);
        while (arrayList.size() > 1) {
            // 1. 将数组从小到大排序
            Collections.sort(arrayList);
            // 2. 选择权值最小的两个节点组成树,其根结点为两子节点权值之和
            HuffNode leftNode = arrayList.get(0);
            HuffNode rightNode = arrayList.get(1);
            HuffNode parent = new HuffNode(leftNode.value + rightNode.value);
            parent.right = rightNode;
            parent.left = leftNode;
            // 3. 将根节点权值放回数组中,并重复上述操作
            arrayList.remove(leftNode);
            arrayList.remove(rightNode);
            arrayList.add(parent);
        }
        return arrayList.get(0);
    }

    /**
     * 设置哈夫曼编码
     * @param c 字符,根据字符查找,并记录路径
     * @param code
     */
    public void setHuffCode(char c , String code) {
        if (this.root==null) {
            System.out.println("空");
        }else {
            root.setHuffCode(c,code);
        }
    }
}
public class HuffmanTreeDemo {

    /**
     * 统计字符串中每个字符出现的次数
     * @param str
     * @return
     */
    public static char[][] countTimes(String str) {
        char[][] letter = new char[2][str.length()];
        ArrayList arrayList = new ArrayList();
        for (int i = 0 ; i < str.length() ; i++) {
            arrayList.add(str.charAt(i));
        }
        int temp = 0 ;
        while (arrayList.size() > 0) {
            int i = 0;
            // 每次根据队列的第一个元素进行查询,若有相同元素计数++,并且将其删除
            letter[0][temp] = (char) arrayList.get(0);
            while (i < arrayList.size()) {
                if (letter[0][temp] == (char)arrayList.get(i)) {
                    letter[1][temp]++;
                    arrayList.remove(arrayList.get(i));
                }else {
                    i++;
                }
            }
            temp++;
        }
        char[][] le = new char[2][temp];
        for (int i = 0 ; i < temp ; i++) {
            le[0][i] = letter[0][i];
            le[1][i] = letter[1][i];
        }
        return le;
    }

【数据结构】详解二叉树|图 最优二叉树又称哈夫曼树,是一类带权路径长度最短的树。路径:树中一个结点到另一个结点之间的通路。结点的路径长度:路径上的分支数树的路径长度:根结点到达每一个叶子结点之间的路径长度之和权:结点代表的值结点的带权路径长度:该结点到根结点之间的路径长度乘以该结点的权值树的带权路径长度(树的代价):树的所有叶子结点的带权路径长度之和哈夫曼树的求法:给出一组权值,将其中最小的两个权值作为叶子结点,其和作为父结点,组成二叉树,然后删除这两个叶子结点权值,将父结点的值添加到这组权值中。 阅读详情

相关推荐

最优二叉树

叶子结点的权值:对叶子结点赋予的一个有意义的数值量。 二叉树的带权路径长度:设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。 记为: 哈夫曼树:给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树。 哈夫曼树的特点: 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为...

weixin_45655152的博客 1370

离散数学(本)复习题

离散数学(本) 试题 一、单项选择题(每小题3分,本题共15分) 1.若集合A={a,b},B= {a,b,{a,b}},则( ). 2.集合A={1,2,3,4,5,6,7,8}上的关系R={<x,y>∣x+y=10且x,yA},则R的性质为( ). A.自反的 B.对称的 C.传递且对称的 D.反自反且传递的 A.0 B.2 C.1 D. 3 4.如图一所示,以下说法正确的是( ...

愤怒的阿木木的博客 5825

IDM更改下载路径的详细指南

Internet Download Manager(IDM)是一款功能全面的下载加速工具,它支持多种浏览器和协议,能够显著提升下载速度,同时提供断点续传、多线程下载等实用功能。IDM的用户界面简洁明了,操作便捷,使得用户能够轻松管理下载任务。此外,IDM还支持自动分类下载文件、定时下载等高级功能,进一步提升了用户的下载体验。通过本文的介绍,相信用户已经掌握了如何在IDM中更改下载路径的方法。这一功能不仅提升了下载效率和文件管理便捷性,还满足了用户的个性化需求。

nntxthml的博客 1763

哈夫曼树(最优二叉树)

给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小(所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度)称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则

1.3秒前 1282

从SSD到UFS:3分钟搞懂存储技术进化史(含最新协议对比)

本文梳理了从SSD到UFS的存储技术演进历程,重点解析了eMMC与UFS在架构上的核心差异。UFS凭借高速串行全双工接口,实现了性能与能效的飞跃。文章还对比了最新的UFS 4.0与PCIe 5.0 SSD协议,并探讨了3D NAND、SLC缓存等底层技术,揭示了移动与PC存储技术融合的未来趋势。

weixin_29294597的博客 279

宇树机器人丝滑的二人转动作背后,MPC到底是什么?

了解MPC,让我们闻“机”起舞。

Barok的博客 2146

数据结构和算法学习笔记五_树结构的实际应用(1)

数据结构和算法学习笔记五_树结构的实际应用(1) 一、 堆排序 1.1、 堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有 要求结点的左孩子的值和右孩子的值的大小关系。 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 大顶堆举例说明: 小顶堆举例说明 : 一

Inmaturity_7的博客 304

Code Composer Studio 8.3.1安装与常见问题解决指南

本文提供了Code Composer Studio 8.3.1版本的详细安装指南与常见问题解决方案。内容涵盖从下载离线安装包、系统环境准备、自定义安装步骤,到首次启动配置及汉化建议。重点解析了安装过程中可能遇到的闪退、卡顿、Java虚拟机错误等典型问题的排查与修复方法,旨在帮助开发者高效部署这一稳定的嵌入式集成开发环境。

weixin_29195217的博客 332

go语言:实现霍夫曼树(附带源码)

go语言:实现霍夫曼树(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 818

使用 Vosk 实现语音识别

在近两年里,如果说想要在本地部署离线语音识别模型,那么和肯定是首选项。所以为什么要使用呢?

weixin_48967543的博客 9719

保姆级教程:在瑞芯微RV1126B上部署轻量化YOLOv8,实现端侧实时目标检测

本文详细介绍了在瑞芯微RV1126B芯片上部署轻量化YOLOv8模型的完整流程,包括开发环境搭建、模型训练优化、量化转换及嵌入式部署。通过利用RV1126B的3TOPS NPU算力和AI-ISP特性,实现端侧实时目标检测,提升边缘AI应用的性能和效率。

weixin_30329623的博客 269

2024年最新数据结构与算法-赫夫曼树_数据结构与算法哈夫曼树计算题,开发者必备的顶级大数据开发开发工具

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

2401_84573112的博客 288

编程实践:寒武纪-LLM&VLM模型量化&部署

本文介绍了在MLU370-S4平台上对大模型(LLM/VLM)进行量化的两种方法:SmoothQuant和WeightOnly。以Qwen2-VL-2B模型为例,详细说明了两种量化方式的命令行参数配置,包括必须设置的per_channel选项和量化参数调整建议。量化完成后,提供了模型部署的具体命令示例,包含设备分配、端口设置、并行度等关键参数。文章强调在MLU370芯片上需要手动设置block_size,并指出两种量化方式只能二选一使用。配套资料已上传至百度网盘供参考。

微风❤水墨 510

DP之最优二叉树(算法导论学习)

声明:本文的思想来自《算法导论》,都是自己在学了算法导论之后复习时候写的。 首先介绍下最优二叉树查找: 在二叉树中查找想要的关键字的话,我们想要得到的查找的消耗最少,对于查找某一个关键字的结点而言,查找该关键字过程中所查找过的结点的数目就是等于该结点的深度在加上1(对自己解释一下:自己初看这个的时候以为是不对的,但是想想是正确的,因为在一颗二叉树中找某一个结点的话会进行大小比较并通过比较之后确

1446

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

专注于编程、AI、人工智能等多个领域内容研究和分析 592

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法与数据结构学习(41)-赫夫曼树

赫夫曼树基本介绍 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 赫夫曼树几个重要概念和举例说明 1.路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通...

九岁ya的博客 1090

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python算法学习[4]—树、二叉树、霍夫曼树&算法实现

然后不断从堆中弹出两个权值最小的节点,将它们合并成一个新的节点,并将该节点再次插入堆中,直到只剩一个节点为止。该树的构建过程是将权值最小的叶子节点不断合并,直到所有节点都合并为根节点为止。通常情况下,频繁出现的字符会被赋予较短的编码,而不常用的字符则会被赋予较长的编码。在上述代码中,BinaryTreeNode类表示二叉树的节点,其中包含该节点的值、左子节点和右子节点。在上述代码中,Node类表示树的节点,其中包含该节点的值和子节点列表。二叉树和霍夫曼树是树的两个变种,也是常用的算法和数据结构。

Python领域优质萌新学习笔记 397

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

学习笔记:数据结构与算法(十三):赫夫曼树

学习笔记:数据结构与算法(十三):赫夫曼树赫夫曼树定义构造过程 赫夫曼树 定义 把两棵二叉树简化成叶子结点带权的二叉树(树结点间的连线相关的数叫做权) 结点的路径长度:从根结点到该结点的路径上的连接数 树的路径长度:树中每个叶子结点的路径长度之和 结点带权路径长度:结点的路径长度与结点权值的乘积 树的带权路径长度:树中所有叶子结点的带权路径长度之和。 构造过程 在森林中选出两棵根结点的权值最小的二叉树 合并选出的两个二叉树,新增加一个结点作为他俩的根,权值为二者之和。 在森林里选出两棵根结点的权值最小的

lelelewei的博客 190

霍夫曼编码,以及最优二叉树(霍夫曼建树)(算法导论学习)

发个牢骚:尼玛,今天花了大半天看,本来兴致勃勃的想用C和c++懂写一次,搞半天只写了个c的实现,哎,实验室终究不是该呆的地方啊,学习效率低,以后看书不带耳机了。先贴出c的实现代码,第二遍看算法导论的时候在c++写吧,搞得我心情都不好了,今天。 对于霍夫曼编码的建树过程而言的话,它实际上是上是贪心算法的一个有效的利用,第一,它满足的是最优子结构的,具体的各种分析见算法导论吧。第二的话,每次建树的时

1082

数据结构与算法C语言版学习笔记(6)-树、二叉树、赫夫曼树

前面说,数据的逻辑结构包括线性结构和非线性结构,线性结构学了线性表(顺序表与链表)、栈与队列、串等,而现在要接触的树是非线性结构,它是一对多的关系,更加复杂。(1)结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。比如D有三个子树,度为3;C有两个子树,度为2。(2)树的度是树内各结点的度的最大值。如图6-2-4所示,因为这棵树结点的度的最大值是结点D的度,为3,所以树的度也为3。

qq_53092944的博客 447

【数据结构与算法】——赫夫曼树

🎄:优快云的小伙伴们大家好,今天跟大家分享一个二叉树的应用案例——赫夫曼树。如果这篇文章对你有用,麻烦给我点个小赞以示鼓励吧🎄

秋雨绵绵 1482

算法学习汇总

算法学习之基数排序_管管儿的博客-优快云博客算法学习之快速排序_管管儿的博客-优快云博客算法学习之归并排序_管管儿的博客-优快云博客算法学习之插入排序_管管儿的博客-优快云博客算法学习之堆排序_管管儿的博客-优快云博客......

fnetworkmaster的博客 102

数据结构与算法学习十九:赫夫曼树树(图文很详细)、赫夫曼编码、应用实践(数据压缩、数据解压)、这一章自我感觉看懂就好。。。

文章目录前言一、赫夫曼树1.1 基本介绍1.2 赫夫曼树的概念1.3 思路图解分析1.3.1 案例1.3.2 步骤分析1.3.3 图文分析1.4 代码实现1.4.1 Node 节点类1.4.2 HuffmanTree赫夫曼树类二、赫夫曼编码2.1 基本介绍2.2 原理剖析2.2.1 通信领域中信息的处理方式1-定长编码2.2.2 通信领域中信息的处理方式1-变长编码2.2.3 通信领域中信息的处理方式1-赫夫曼编码 前言 一、赫夫曼树 1.1 基本介绍 给定 n 个权值作为 n 个叶子结点,构造一棵二叉

冯安晨 825

word2vec之霍夫曼树的实现

word2vec huffman树

老笨妞 4354

数据结构与算法学习之赫夫曼树实现数据/文件压缩与解压

数据结构与算法学习之赫夫曼树实现数据/文件压缩与解压

m0_55895641的博客 324

JAVA-数据结构与算法-堆排序和赫夫曼树

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取! arr[i] = arr[k]; //把大的值赋给当前节点i = k; //将k的值给i,循环结束找到最大值后,将父节点的值给子节点} else {break;}}//for循环结束后,已经将i作为父节点的最大值,放在了这个树最顶部//将temp换到被交换的叶子节点arr[i] = temp;}复制代码public static void adjustHeap(int[] arr, int i, int l

2301_79055083的博客 410
上一篇: 算法学习之二叉排序树的平衡化
管管儿
博客等级 码龄7年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值