算法 哈夫曼树和哈夫曼编码

news2025/4/24 23:15:38

目录

前言

一,二进制转码

二,哈夫曼编码和哈夫曼树

 三,蓝桥杯 16 哈夫曼树

总结


前言

这个文章需要有一定的树的基础,没学过树的伙伴可以去看我博客树的文章

当我们要编码一个字符串转成二进制的时候,我们要怎么操作呢?今天我们就来踏进哈夫曼编码的大门学习怎么高效编码和转码,还有学习这个思想的算法题目


一,二进制转码

方法一:二进制编码

编码字符串:ABAACDC

利用二进制:A:0     B:1     C:10     D:11

那么我们就把这个字符串编码形式:0100101110

我们来分析一下这样子编码

这样转码就会有歧义。我们不难来分析一泼,其实你分析不难发现,这个前面是有相同的前缀的
我们上面圈出来就是有前缀相同的,所以我们就会出现这种歧义的情况

方法二:等长编码

利用等长编码:A:00     B:01     C:10     D:11

然后我们就把这个字符串编码形式:00010000101110

我们每次取走两个的话这样就不会有任何的错误,但是这个长度很长,不是最优的解 

 

二,哈夫曼编码和哈夫曼树

字符串:ABAACDC

A:3次     B:1次     C:2次     D:1次

我们就有了四个节点

然后我们就需要每次合并两个最下的节点

然后我们再在3,2,2里面寻找两个最小的节点进行合并,这里面有一个2是我们B和D合并的结果,然后就是寻找两个进行合并。那么就是下面这样的情况

然后我们就剩下了4和3了

以上的树的就构造好了,这也叫哈夫曼树,然后我们在这个图上面加上0和1就好了,就可以进行编码了

然后我们就可以编码
A:1     C:01     D:001     B:000
这个编码的值就是你从根部到对应的子叶节点,然后这个边的数字组合

我们编码就是1000110100101

这个是最短且没有歧义的

前缀问题:

ABCD都是为叶子节点,所以不会再A,B,C,D,这个对应的路上,所以就不会有前缀的情况

最短问题:

出现次数越多的字符,编码越短,因为在越上面
出现次数越少的字符,编码越长,因为在越下面

在权路径:

节点值*所经过的边数(表示走了多少趟数的总路径)

哈夫曼编码不唯一,但是最终的总长是一样的

 

 三,蓝桥杯 16 哈夫曼树

问题描述
  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
  给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
  2. 重复步骤1,直到{pi}中只剩下一个数。
  在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
  本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
  例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
  2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
  3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
  4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
  5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
输入格式
  输入的第一行包含一个正整数n(n<=100)。
  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出格式
  输出用这些数构造Huffman树的总费用。

输入样例:

在这里给出一组输入。例如:

5
5 3 8 2 9

输出样例:

在这里给出相应的输出。例如:

59

代码:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

int main(){
    vector<int>number;
    vector<int>temp;
    int n=0;
    cin>>n;
    //添加元素到容器里面
    for(int i=0;i<n;i++){
       int num=0;
       cin>>num;
       number.push_back(num);
    }
    //进行排序
    while(!number.empty()){
        sort(number.begin(),number.end());
        int operand1=*number.begin();
        int operand2=0;
        number.erase(number.begin());//弹出对应元素
        if(!number.empty()){
            operand2=*number.begin();
            number.erase(number.begin());
        }
        int sumoperand=operand1+operand2;
        temp.push_back(sumoperand);
        if(!number.empty()){
            number.push_back(sumoperand);
        }
    }
    int sum=0;
    for(int i=0;i<temp.size();i++){
        sum=sum+temp[i];
    }
    cout<<sum<<endl;
}

 这个是自己写的,如果有更好地过程,可以在评论区指教

思路:

1,先创建两个容器,一个用来存放数字,一个用来存放两个数字相加和

2,先把数字放到容器里面

3,利用sort()函数进行排序,升序

4,然后不断地抽取这个容器前面两个元素进行相加

5,把相加地元素放到第二个元素里面,然后如果第一个容器为空,说明第一个容器没有可以加地了,就不放了,如果有就继续放

6,最后不断地加这个容器里面地每一个元素就好了,这个循环的次数为这个容器的大小就好了


总结

哈夫曼树的构造就是不断地把最小地合并得出一个数字,然后再从这些数字寻找两个最小的数字求和,不断地把数弄没有为止,注意每次求和要带上那个两个地求和地数字,编码就是再边上赋予0和1就好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sumatra PDF:小巧免费,满足多样阅读需求

Sumatra PDF是一款完全免费的本地阅读器软件&#xff0c;以小巧的体积和全面的功能受到用户青睐。如今&#xff0c;它已经更新到3.3版本&#xff0c;带来了更多实用功能&#xff0c;尤其是新增的注释功能&#xff0c;值得我们再次关注。 软件特色 轻量级体积&#xff1a;压缩…

TiDB 分布式数据库多业务资源隔离应用实践

导读 随着 TiDB 在各行业客户中的广泛应用 &#xff0c;特别是在多个业务融合到一套 TiDB 集群中的场景&#xff0c;各企业对集群内多业务隔离的需求日益增加。与此同时&#xff0c;TiDB 在多业务融合场景下的资源隔离方案日趋完善&#xff0c;详情可参考文章 《你需要什么样的…

105,【5】buuctf web [BJDCTF2020]Easy MD5

进入靶场 先输入试试回显 输入的值成了password的内容 查看源码&#xff0c;尝试得到信息 什么也没得到 抓包&#xff0c;看看请求与响应里有什么信息 响应里得到信息 hint: select * from admin where passwordmd5($pass,true) 此时需要绕过MD5&#xff08;&#xff09;函…

BFS(广度优先搜索)——搜索算法

BFS&#xff0c;也就是广度&#xff08;宽度&#xff09;优先搜索&#xff0c;二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS&#xff08;深度优先搜索&#xff09;。从字面意思也很好理解&#xff0c;DFS就是一条路走到黑&#xff0c;BFS则是一层一层地展开。…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

gym-anytrading

参考&#xff1a;https://github.com/upb-lea/gym-electric-motor AnyTrading 是一组基于 reinforcement learning (RL) 的 trading algorithms&#xff08;交易算法&#xff09;的 OpenAI Gym 环境集合。 该项目主要用于foreign exchange (FOREX) 和 stock markets (股票市场)…

如何自定义软件安装路径及Scoop包管理器使用全攻略

如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径&#xff1f; 问题背景&#xff1a; WingetUI是Windows包管理器Winget的图形化工具&#xff0c;但无法直接修改软件的默认安装路径。原因如下&#xff1a; Winget设计限制&#xf…

私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手

私有化部署 DeepSeek Dify&#xff0c;构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型&#xff0c;凭借其先进的算法架构和反思链能力&#xff0c;为 AI 对话交互带来了革新性的体验。通过私有化部署&#xff0c;你可以充分掌控数据安全和使用安全。…

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识 Java 生态圈Java 跨平台的语言 Java 虚拟机规范JVM 跨语言的平台多语言混合编程两种架构 举例 JVM 的生命周期 虚拟机的启动虚拟机的执行虚拟机的退出 JVM 发展历程 Sun Classic VMExact VMHotSpotBEA 的 JRockitIBM 的 J9 …

V103开发笔记1-20250113

2025-01-13 一、应用方向分析 应用项目&#xff1a; PCBFLY无人机项目&#xff08;包括飞控和手持遥控器&#xff09;&#xff1b; 分析移植项目&#xff0c;应用外设资源包括&#xff1a; GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等&#xff1b; 二、移植项目的基本…

DeepSeek研究员在线爆料:R1训练仅用两到三周,春节期间观察到R1 zero强大进化

内容提要 刚刚我注意到DeepSeek研究员Daya Guo回复了网友有关DeepSeek R1的一些问题&#xff0c;以及接下来的公司的计划&#xff0c;只能说DeepSeek的R1仅仅只是开始&#xff0c;内部研究还在快速推进&#xff0c;DeepSeek 的研究员过年都没歇&#xff0c;一直在爆肝推进研究…

LLM推理--vLLM解读

主要参考&#xff1a; vLLM核心技术PagedAttention原理 总结一下 vLLM 的要点&#xff1a; Transformer decoder 结构推理时需要一个token一个token生成&#xff0c;且每个token需要跟前序所有内容做注意力计算&#xff08;包括输入的prompt和该token之前生成的token&#xf…

vscode软件操作界面UI布局@各个功能区域划分及其名称称呼

文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上&#xff0c;Visual Studio Code 是一个代码编辑器&#xff0c;其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…

一键开启/关闭deepseek

一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek&#xff0c;一键关闭Deepseek双击对应的bat&#xff0c;就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载&#xff1a;https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来&#xff0c;保存成bat文件&#xff0c;也可…

单纯接入第三方模型就无需算法备案了么?

随着人工智能技术的快速发展&#xff0c;越来越多的企业开始接入第三方模型以提升自身业务能力。然而&#xff0c;关于算法备案的问题也引发了诸多讨论&#xff0c;尤其是单纯接入第三方模型是否需要备案这一问题&#xff0c;更是让不少企业感到困惑。 一、明确算法备案的主体…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…

Gitea+Gridea 创建个人博客

历史文档存档&#xff0c;该方法目前已经无法使用&#xff0c;部署方法可供参考 Gitea部分 1.关于Gitea Gitea 是一个面向开源及私有软件项目的托管平台&#xff0c;是全球最大的代码托管平台之一。它采用 Git 分布式版本控制系统&#xff0c;为开发者提供了代码托管、版本控…

【Linux】一文带你入门了解线程和虚拟地址空间中页表映射的秘密(内附手绘底层逻辑图 通俗易懂)

绪论​ 每日激励&#xff1a;“努力去做自己该做的&#xff0c;但是不要期待回报&#xff0c;不是付出了就会有回报的&#xff0c;做了就不要后悔&#xff0c;不做才后悔。—Jack” 绪论​&#xff1a; 本章是LInux中非常重要的线程部分&#xff0c;通过了解线程的基本概念&am…

Flash Attention与Attention

原始Attention是&#xff1a; Flash Attention&#xff1a; 伪代码&#xff1a;4d&#xff08;分别代表Q\K\V\O&#xff09; Flash Attention2优化了