考研复试第十六天:合并果子 【哈佛曼树】

news2024/11/23 11:40:47

前置知识

哈佛曼树:我们先来复习一下啥叫做哈佛曼树

1.背景

我们有下面这样一个字符串需要编码,就是将下面的字符转为二进制。我们采用的方法是前缀编码,用一颗树的叶节点来放字符。

2.前缀编码 

   编码是咋样的呢?看下面这个例子

按照上面这个图片的话,那么d为00,a为01,然后b就为1,c为10.我们根据这个来编码那么编出来就为 0101111111010100000000000000000,此时就会出现一问题,如果我们将这个二进制解码的话,还能回去吗?我们来试试

看上图,显然回不去了,那么就说明上述编码不可以,所以我们需要前缀编码, 让我们来看看前缀编码是如何的。

 定义可能不是很明白,来看例子

看看和刚才的有啥区别,其实就是将b下放了一层,有区别嘛?有,我们发现我们的字母都是在叶子结点,也就是说在每个存放字母的节点它到根节点之间的路径是没有其他字母节点的,那么当我们解码的时候,我们就只会唯一解码,不会出现上面出现歧义的情况。不信?我们来试试

 你可以自己动手画画,你会发现当你从左往右解码的时候只有一种情况不会出现上面那种不知道如何解码的情况。

3. 哈佛曼树

哈佛曼树其实就是依据上面的写的东西来建的树。然后我们有一个目的就是让我们建的树的带权路径(WAL)是最小的 WPL=(W1L1+W2L2+W3L3+…+WnLn),就是说每个节点的中的权重然后乘以其路径之长(Wn为节点权重,Ln为路径长度)之和最小。如何使它最小呢?其过程是这样的

这样就构造了一颗WAL最小的哈佛曼树。有人可能会问为啥?我们可以来证明一下。

4.哈佛曼树最优证明

1.哈佛曼树为了满足前缀编码那就是必须存字符的节点就必须是叶节点。

2.并且总存在一个最优解(WAL最小),里面最小的两个节点是兄弟节点

这第二步我们来证明一下,我们分为两种情况。

1.两个最小是兄弟节点 。2.两个最小的不是兄弟节点。

分两种情况

两个最小的节点都在一层,那么是否是兄弟节点都无所谓。

两个最小的节点不在同一层。

 

题目

 

这道题按照上面的算法也就是,每次将最小的两个数拿出来,然后相加就行。 

返回最小,然后删除最小的,用最小堆再适合不过了。所有就有以下代码。

#include <iostream>
#include <queue>
using namespace std;
int n;
priority_queue<int, vector<int>, greater<int> > q;
int main(){
    int n;
    cin>>n;
    while(n--){
        int a;
        cin>>a;
        q.push(a);
    }
    int res = 0;
    while(q.size() > 1){
        auto a = q.top();
        q.pop();
        auto b = q.top();
        q.pop();
        res += a + b;
        int c = a + b;
        q.push(c);
    }
    cout<<res;
    return 0;
}
 

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

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

相关文章

BurpSuite—Project options模块(项目选择)

本文主要BurpSuite—Project options模块(项目选择)介绍的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt 一、简介 Project options主要用来对Project的一些设置。 二、模块说明 Project options主要由五个模块组成: 1.Connect…

Zabbix“专家坐诊”第192期问答汇总

问题一 Q&#xff1a;请问下&#xff0c;客户机snmptrap发告警为啥server web收不到&#xff0c;关键是snmptrap日志已经收到&#xff0c;zabbix server配置以及开启snmptrap1 snmptrapvar log snmptrap snmptrap.log&#xff1f; A&#xff1a;有配置trap的监控项吗&#xff…

Install ELK+Filebeat on Kubernetes Cluster with Helm

目录 Node & Software & Docker Images Lists Prerequisites Install ELK Manually Deploying ElasticSearch Create deployment Expose deployment Deploying Kibana Create deployment Accessing the Kibana UI Deploying Logstash Create ConfigMap and…

快手上市后首次盈利,直播电商业务成造血利器

5月22日盘前&#xff0c;快手业绩还没有发布&#xff0c;股价却先涨为敬&#xff0c;中信证券、彭博、中金公司等多家机构给出超预期业绩的预测。盘后公布的业绩确实超过市场的一致预期&#xff0c;市场在今天也给出正面回应&#xff0c;股价再次上扬&#xff0c;最高点达57.10…

revit窗族的平面出图设置,revit快速创建幕墙

一、revit窗族的平面出图设置 在平面视图中&#xff0c;为了满足出图的需要&#xff0c;我们经常要修改在不同的详细程度的可见性设置。 例如我们的窗在没有进行设置时在粗略/中等/精细的详细程度中都可以看到清晰的窗体构件。那么要使窗在精细程度中才可以看见详细的窗体结构&…

Sentinel如何实现对分布式系统的高可用性和流量控制?我们通过源码一起学习

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍Sentinel源码实现对分布式系统高可用性和流量控制&#xff0c;后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教…

蓝桥杯单片机DS18b20单总线测温模块常见问题解决

蓝桥杯单片机DS18b20单总线测温模块常见问题解决 有道是&#xff1a;“溪水声声留我住&#xff0c;梅花朵朵唤人回” DS18b20测温模块作为一个比较简单、稳定的蓝桥杯单片机外设模块&#xff0c; 使用时却经常出现各种问题&#xff0c;总是让我们不禁三番多次回顾其基础知识…

再获认可!腾讯连续三年被Gartner列为CWPP供应商之一

随着云的快速发展&#xff0c;企业的工作负载已经从服务器发展到虚拟机、容器、serverless等&#xff0c;部署的模式也日益复杂&#xff0c;包括公有云、混合云和多云等。在此背景下&#xff0c;传统的主机安全防护已无法满足需求&#xff0c;CWPP&#xff08;云工作负载保护平…

飞鹤乳业携手用友,重塑财务价值,开创财务共享服务新局面

在这个数字化时代&#xff0c;企业需要不断地面对各种变革和挑战&#xff0c;而数字化财务共享服务正是帮助企业应对挑战和实现数字化转型的有效手段之一。飞鹤乳业携手用友&#xff0c;以数字化财务共享服务平台为契机&#xff0c;旨在整合财务资源&#xff0c;优化财务流程&a…

小白必看!数据库自学入门教程,免费的SQL认证课程

在数据库国产化浪潮下&#xff0c;你是否想尽快更新你的知识体系&#xff1f;好程序员整理了免费的SQL认证教程&#xff0c;方便大家按需选择学习&#xff0c;证明自己的实力&#xff0c;获得更多职场机会&#xff01; 1.SQL数据分析- Udacity 2.SQL入i]- Codecademy 3.SQL Ser…

从零实现一个数据库(DataBase) Go语言实现版 4.B树实现(Part1))

英文源地址 本章将使用Go语言实现一个不可变地B树.这是一个最小实现, 因此很容易理解. Node节点的格式 我们的B树最终将被持久化到磁盘上, 因此我们首先需要为b树节点设计数据格式.如果没有这种格式, 我们将无法知道节点的大小以及何时拆分节点. 一个节点包含: 一个固定大小…

Bug可以说是一种缺陷吗?

我叫缺陷&#xff0c;从被创建至关闭&#xff0c;到最后做缺陷分析&#xff0c;这是我的完整生命周期。我的整个生命周期贯穿着整个项目的项目周期&#xff0c;因此&#xff0c;掌握我的生命周期&#xff0c;不止是测试人员必修的课程&#xff0c;也是测试人员的灵魂。 缺陷的…

Android 动态加载资源

资源文件分类 1.android资源文件分为两类&#xff1a; 第一类是res目录下存放的可编译资源文件&#xff0c;编译时&#xff0c;系统会自动在R.java中生成资源文件的十六进制值&#xff0c;如下所示&#xff1a; public final class R {public static final class id {public …

从注解@EventListener和@TransactionalEventListener掌握Spring的事件机制原理

文章目录 Spring事件监听机制Spring事件监听机制概述Spring事件监听机制介绍Spring事件相关的几个类使用硬编码简单还原Spring事件机制 Spring事件机制正确的使用方式Spring事件创建Spring事件发布方式Spring事件监听方式面向接口的方式面向注解的方式EventListenerTransaction…

SpringBoot开发实用篇2---与数据层技术有关的替换和整合

四、数据层解决方案 1.SQL 现有数据层解决方案技术选型&#xff1a;DruidMyBatis-plusMySQL 数据源&#xff1a;DruidDataSource 持久化技术&#xff1a;MyBatis-plus/MyBatis 数据库&#xff1a;MySql 内置数据源&#xff1a; SpringBoot提供了3种内嵌的数据源对象供开发者选…

2023年数据治理企业老板为啥都让员工考CDGA/CDGP证书?

企业老板让员工考取CDGA证书一般有以下几个原因: 提升数据治理能力 CDGA认证是一种全球通用的数据治理认证&#xff0c;可以帮助员工提升数据治理的技能和能力更好地管理、保护和分析企业的数据。 增强员工竞争力 随着数据治理在企业中的重要性越来越高&#xff0c;拥有CDGA…

day01_单元测试_配置文件

一、软件的生命周期 **软件的可行性分析:**分析该软件是否值的研发,会消耗多少成本,能带来多少的利益等分析 **需求分析:**分析该软件具体该具备有那些功能,产品经理与客户一起讨论 **软件设计:**该软件应该使用什么样的架构,用什么样的数据库,每个模块的具体功能 **程序编…

Github Copilot 的补强工具Github Copilot Labs的常用功能介绍

一、什么是Github Copilot Labs Github Copilot Labs是由GitHub推出的一款基于人工智能技术的代码协作工具&#xff0c;旨在协助开发者更加快速、高效地编写代码。该工具使用了机器学习技术&#xff0c;通过学习大量的开源代码和编写实践&#xff0c;提供了对于代码变量、函数…

物理删除与逻辑删除

目录 一、物理删除与逻辑删除 二、逻辑删除实现 三、API使用方法 四、全局配置参数 一、物理删除与逻辑删除 物理删除&#xff1a;指文件存储所用到的磁存储区域被真正的擦除或清零&#xff0c;这样删除的文件是不可以恢复的&#xff0c;物理删除是计算机处理数据时的一个概…

怎样的年轻化法则,让这个品牌四年净利润复合增速达30%

年轻世代消费者的崛起&#xff0c;从消费层面讲&#xff0c;为市场带来活跃的同时&#xff0c;给品牌带来的是如何转型升级的问题&#xff0c;在众多转型的品牌中&#xff0c;年轻化策略与方式不尽相同。 在2019年至2022年期间&#xff0c;报喜鸟营收复合增速达10%&#xff0c…