2. 计算WPL
题目
Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。
更多关于Huffman编码的内容参考教材第十章。
输入:
第一行为要编码的符号数量n
第二行~第n+1行为每个符号出现的频率
输出:
对应哈夫曼树的带权路径长度WPL
解释
①哈夫曼树的构造
哈夫曼树,也称为最优二叉树,是一种带权路径长度(WPL)最短的二叉树。这里的带权路径长度就是叶子节点的权值与它到根节点的路径长度之积的总和。
哈夫曼树的构造方法是基于贪心算法,步骤如下:
1. 将每个权值看作是独立的一棵树,这些权值通常来自要编码字符的频率。
2. 在所有未构造二叉树的集合中选出两个权值最小的树作为左右子树,构造出一棵新的二叉树,同时这两个权值之和作为新的父节点的权值。
3. 在集合中删除这两个已经被使用的节点,将新构造的二叉树(父节点)加入到集合中。
4. 重复其中的步骤2-3,直到集合中只剩下一棵树,这棵树就是最终的哈夫曼树。
哈夫曼树常见的应用是哈夫曼编码,它是一种被广泛用于数据压缩的编码方式。根据哈夫曼树,我们可以为叶子节点分配相应的哈夫曼编码,使得编码长度短的更常见,这样可以有效地减少编码的总长度,达到数据压缩的目的。
②WPL的计算
带权路径长度(Weighted Path Length,简称 WPL),它是所有叶子节点的权值乘以其到根节点的路径长度之和。
以二叉树为例,叶子节点是没有子节点的节点,而根节点是最顶层的节点。路径长度则是从一个节点到另一个节点之间的边的数量。
具体计算过程如下:
1. 对每个叶子节点,计算根节点到该叶子节点的路径长度,即从根节点到叶子节点所经过的边的数量。
2. 将每个叶子节点的权值与其对应的路径长度相乘。
3. 将上述所有的乘积相加,得到的总和就是这棵树的带权路径长度。
在哈夫曼编码中,我们通常希望带权路径长度尽可能的小,这样可以让编码更加高效。
C++代码
#include <iostream>
#include <queue> using namespace std;struct Node { // 定义节点结构体int freq; // 频率Node* left; // 左子节点Node* right; // 右子节点
};// 创建新的节点
Node* newNode(int freq) // 定义新节点的创建函数,输入是频率值,返回创建的新节点的指针
{Node* node = new Node(); // 动态创建新节点node->left = node->right = NULL; // 初始化左右子节点为空node->freq = freq; // 设置新节点的频率return (node); // 返回新节点的指针
}// 比较节点的频率
struct compare { // 定义比较结构体,作为优先级队列的比较函数bool operator()(Node* l, Node* r) // 重载括号运算符,用以比较两个节点的频率{return (l->freq > r->freq); // 如果第一个节点频率大于第二个,返回真,否则假}
};// 计算哈夫曼树的权值路径长度
int calculateWPL(Node* root, int depth = 0) // 定义计算WPL的函数,输入是根节点的指针和路径深度(默认为0),返回路径长度值
{if (!root) return 0; // 如果节点为空,返回0if (!root->left && !root->right) return depth * root->freq; // 如果是叶子节点(无左右子节点),返回当前深度乘以节点频率// 如果不是叶子节点,递归计算左右子树的WPL,返回两者之和return calculateWPL(root->left, depth + 1) + calculateWPL(root->right, depth + 1);
}int main() { int n;cin >> n; priority_queue<Node*, vector<Node*>, compare> pq; // 定义一个优先队列,用于存储节点指针,利用 compare 结构体比较节点频率for (int i = 0; i < n; ++i){int freq;cin >> freq; // 输入每个节点的频率值pq.push(newNode(freq)); // 创建新的节点,并将其添加到优先队列中}while (pq.size() != 1) { // 当优先队列中只有一个元素时,结束循环Node* left = pq.top(); // 获取频率最小的节点,作为左子节点pq.pop(); // 将该节点从优先队列中移除Node* right = pq.top(); // 获取频率次小的节点,作为右子节点pq.pop(); // 将该节点从优先队列中移除int sum = left->freq + right->freq; // 计算左右子节点频率之和Node* top = newNode(sum); // 以这个频率和创建新节点top->left = left; // 将左子节点连接到新节点top->right = right; // 将右子节点连接到新节点pq.push(top); // 将新节点添加到优先队列中}cout << "WPL=" << calculateWPL(pq.top()) << endl; // 输出哈夫曼树的带权路径长度return 0; // 程序执行成功,返回0
}
相关文章:
2. 计算WPL
题目 Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。 更多关于Huffman编码的内容参考教材第十章。 输入: 第一行为要编码的符号数量n 第二行~第n1行为每个符号出现的频率 输…...
筹备三年,自动驾驶L3标准将至,智驾产业链的关键一跃
作者|张祥威 编辑|德新 多位知情人士告诉HiEV,智能网联汽车准入试点通知,乐观预计将在一个月内发布。试点的推动,意味着国家层面的自动驾驶L3标准随之到来。 「L3标准内容大部分与主机厂相关,由工信部牵头,找了几家…...
【Python】Python使用Switch语句
这里写目录标题 1.使用字典(Dictionary)2.使用if-elif-else 1.使用字典(Dictionary) 在 Python 中,没有内置的 switch 语句,但可以使用其他方式来实现类似的功能。以下是两种常见的方法: 使用…...
一年一度的1024程序员节
前言 1024 程序员节是中国程序员的节日,于每年的 10 月 24 日庆祝。这个节日旨在纪念和表彰程序员对科技和社会发展所做的贡献。 1024 程序员节最早由中国互联网公司 CSDN(中国软件开发者网)发起,自然而然地成为了中国程序员社区…...
第十七章 数据库操作
数据库基础 和JDBC概论和常用类和接口就不过多的说了 直接来到 数据库的操作 一开始是在数据库中插入了四个类型 两个int 两个varchar类型 再分别插入 名字 序号 号码 性别 然后再在java中操作增删改查 这几个操作 全部代码如下 package 第十七章; import j…...
RTI-DDS代码分析使用介绍
DDS(Data Distribution Service数据分发服务)是对象管理组织OMG的有关分布式实时系统中数据发布的规范。 DDS规范采用了发布/订阅体系结构,但对实时性要求提供更好的支持。DDS是以数据为中心的发布/订阅通信模型。 以下工程基于rti_connext_dds-7.2.0 hello_world.…...
ant-design-vue 3 a-table保留选中状态
业务需求需要保留选中状态 <a-table class"satistic-table" :row-selection"{ selectedRowKeys: selectedRowKeys, onSelect:onSelect,onSelectAll:onSelectAll }" :row-key"(row)>{ return row.customerId}" :columns"columns"…...
golang 工程组件:grpc-gateway option自定义http规则
option自定义http规则和http body响应 简介 本篇接上文 golang 工程组件:grpc-gateway 环境安装默认网关测试 默认网关配置终究是难用,本篇介绍一下proto里采用option自定义http规则以及让网关返回http响应而不是我们定义的grpc响应 option定义http…...
亚马逊添加购物车和收藏有什么区别
亚马逊的添加购物车和收藏是两个不同的功能,它们在用户行为和用途上有明显的区别: 1、添加购物车(Add to Cart): 当用户点击"添加到购物车"按钮时,所选商品将被放入他们的购物车,而…...
JAVA-编程基础-11-03-java IO 字节流
Lison <dreamlison163.com>, v1.0.0, 2023.05.07 JAVA-编程基础-11-03-java IO 字节流 文章目录 JAVA-编程基础-11-03-java IO 字节流字节输出流(OutputStream)FileOutputStream类**FileOutputStrea 的构造方法**使用文件名创建FileOutputStream…...
python之Cp、Cpk、Pp、Ppk
目录 1、Cp、Cpk、Pp、Ppk 2、python计算 1、Cp、Cpk、Pp、Ppk Cp Process Capability Ratio 可被译为“过程能力指数” Cpk Process Capability K Ratio 可被译为“过程能力K指数” Pp Process Performance Ratio 可被译为“过程绩效指数” Ppk Process Performance K Ra…...
统信uos 1030 企业版 安装.net core环境
安装.net core步骤 添加密钥和包存储库 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-mic…...
2023/10/23学习记录
1.VS2019中sln对应解决方案 修改sln的文件名,对应的解决方案名称也会变化。 2.如何修改生成的exe文件名呢? 属性--->杂项--->(名称) 3.这是任务管理器,这里红色部分显示的是“这是文件描述”。 当通过属性查看详细信息的时…...
flask入门(四)前后端数据传输
文章目录 1、flask后端接收来自前端的数据1)如果前端提交的方法为POST2)如果前段提交的方法是GET 2、flask后端向前端传数据3、案例参考文献 1、flask后端接收来自前端的数据 1)如果前端提交的方法为POST 后端接收时的代码: xx…...
JS——垃圾回收的原理
引言 JavaScript是一种高级的、解释型的编程语言,广泛应用于网页开发和移动应用开发中。在JavaScript中,内存管理是一个重要的话题,而垃圾回收就是内存管理的一部分。本文将介绍JavaScript垃圾回收的原理,并提供一些示例代码来帮助…...
Spring Cloud Gateway 路由构建器的源码分析
Spring Cloud Gateway 路由构建器的源码分析 文章目录 1. 路由构建器的入口2. 创建路由规则3. 设置路由规则和属性4. 路由过滤器的设置5. 构建和获取路由规则:6. 实例化路由构建器:8. 路由构建器的源码分析8.1 RouteLocator接口8.2 RouteLocatorBuilder…...
IT行业哪个方向比较好就业?
IT行业哪个方向比较好就业? IT行业里,哪些方向更好就业,这是一个很常见也很重要的问题。不同的IT方向有不同的技能要求、就业前景和发展空间,因此需要根据自己的兴趣、能力和目标来选择合适的方向。 软件开发与工程:软件开发是…...
uniapp中nvue页面使用fixed后,数据更改不更新到该视图。
解决方案:position: fixed;定位改成position: absolute; 记录一下,遇到这个贼离谱的问题,uniapp项目里的nvue页面因为要弄个引导蒙版,所以使用了fixed定位,点击蒙版关闭,加了this.$forceUpdate()也不行&am…...
力扣第55题 跳跃游戏 c++ 贪心 + 覆盖 加暴力超时参考
题目 55. 跳跃游戏 中等 相关标签 贪心 数组 动态规划 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true &…...
系列十四、Redis的集群(一)
一、是什么 1.1、概述 由于数据量过大,单个master-slave模式难以承担,当出现master节点故障的一瞬间,哨兵重新选举新的master节点之前,这一小段时间将会导致Redis服务不可用,因此需要对多个master-slave主从复制集进行…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
