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
}

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

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

相关文章

npm install报错 缺少python

报错信息&#xff1a; Building:E:tolsnvmnodesnodeexe : ode emos ant-desig-we-eos odemodules node-gypbintnode-gp.s rebld -verbose -Libsass_ext --Libsas_cflags- lags --libsass_librarygyp info it worked if it ends with ok gyp verb cli [ gyp verb cliE: toolsnv…

一步一步认知机器学习

1&#xff0c;前言 之前学习并且实操了一些算法框架用来探索相关方向的可能性&#xff0c;但是总不了解相关的步骤。因为一步一步按照别人给出的步骤去操作&#xff0c;解决一些操作时出现的问题&#xff0c;基本可以达到目的。但是这个也基本限制了在那个框架而已。对于算法还…

Socket 是什么? 总结+详解

文章摘要&#xff1a;Socket 套接字 编程接口 netstat-ano 创建 建立连接 断开 删除 1.Socket 是什么 Socket &#xff1a;套接字&#xff08;socket&#xff09;是一个抽象层&#xff0c;应用程序可以通过它发送或接收数据&#xff0c;可对其进行像对文件一样的打开、读写和…

SpringBoot的日志系统(日志分组、文件输出、滚动归档)

[toc](目录) > SpringBoot3需要jdk17 # 1. 简介 1. Spring5及以后Spring自己实现了commons-logging&#xff0c;来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter Java package org.apache.commons.log…

如何把Elasticsearch中的数据导出为CSV格式的文件

前言| 本文结合用户实际需求用按照数据量从小到大的提供三种方式从ES中将数据导出成CSV形式。本文将重点介Kibana/Elasticsearch高效导出的插件、工具集&#xff0c;通过本文你可以了解如下信息&#xff1a; 1&#xff0c;从kibana导出数据到csv文件 2&#xff0c;logstash导…

VMware vCenter Server 6.7安装过程记录

0、前言 最近由于一些原因需要安装测试VMware ESXi&#xff0c;无奈所有服务器都是十几年前的&#xff0c;配置低也不支持。后来通过VMware兼容性列表查询&#xff0c;快要放弃的时候发现唯一一台Dell R420&#xff0c;如获至宝。通过查询得知最高支持到6.5 U3&#xff0c;好在…

十三水中各种牌型判断LUA版

近期回归程序行业&#xff0c;由于业务需求需要做十三水游戏&#xff0c;什么是十三水就不在多讲&#xff0c;下面是判断十三水牌型的方法&#xff08;带大小王&#xff09; GetSSSPaiType {}; local this GetSSSPaiType; local huaseTable {}; local numTable {}; functi…

在亚马逊购买产品时怎么选择自动收货方式

在亚马逊购买产品时&#xff0c;通常可以在下单时选择不同的收货方式&#xff0c;包括自动收货方式。以下是一般的购买流程&#xff1a; 登录亚马逊账号&#xff1a;打开网站&#xff0c;登录账号&#xff0c;如果没有账号&#xff0c;可以先创建一个。 浏览和添加商品&#…

SpringBoot原理篇

SpringBoot原理篇 ​ 其实从本人的角度出发&#xff0c;看了这么多学习java的小伙伴的学习过程&#xff0c;个人观点&#xff0c;不建议小伙伴过早的去研究技术的原理。原因有二&#xff1a;一&#xff0c;先应用熟练&#xff0c;培养技术应用的条件反射&#xff0c;然后再学原…

v4l2-ioctl.c的一些学习和整理

可以发现&#xff0c;这个宏用的很好&#xff0c;简洁易扩展&#xff0c;自己写代码可以学习下 #define IOCTL_INFO(_ioctl, _func, _debug, _flags) \[_IOC_NR(_ioctl)] { \.ioctl _ioctl, \.flags _flags, \.name #_ioctl, \.func _func, \.debug _…

element table中嵌套el-select 无法选择问题

<el-table-column align"left" label"姓名" show-overflow-tooltip :key"tableKey"><template slot-scope"scope"><el-select placeholder"请选择" :disabled"!saveButton" v-model"scope.ro…

多用户多回路宿舍用电管理解决方案-安科瑞黄安南

01 引言 近几年来&#xff0c;因违规使用大功率恶性负载电器导致宿舍失火的安全事故在各大高校时有发生&#xff0c;给学生和学校都带来了巨大的损失。北京大学、哈尔滨工业大学、上海商学院以及俄罗斯人民友谊大学等高校学生公寓发生的火灾给高校学生公寓的安全用电敲响…

element-ui 图片压缩上传

export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getContext(2d) …

车载网关通信能力解析——SV900-5G车载网关推荐

随着车联网的发展,各类车载设备对车载网关的需求日益增长。车载网关作为车与车、车与路、车与云之间连接的关键设备,其通信能力直接影响整个系统的性能。本文将详细解析车载网关的通信能力,并推荐性价比高的SV900-5G车载网关。 链接直达&#xff1a;https://www.key-iot.com/i…

初探亚马逊 AI 编程助手 CodeWhisperer

前言 4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用,同时推出的还有供所有开发人员免费使用的个人版&#xff08;CodeWhisperer Individual&#xff09;。Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&…

Jenkins CLI二次开发工具类

使用Jenkins CLI进行二次开发 使用背景 公司自研CI/DI平台&#xff0c;借助JenkinsSonarQube进行代码质量管理。对接版本 Jenkins版本为&#xff1a;Version 2.428 SonarQube版本为&#xff1a;Community EditionVersion 10.2.1 (build 78527)技术选型 Java对接Jenkins有第…

arco-disign vue + vue3 封装一个“下拉多组单选组件”

手搓一个下拉框多组单选组件, 实现采用框架 arco-disign vue + vue3 组件采用:a-popover、a-input-tag、a-radio-group、a-radio 实现效果: 调用组件 <SelectGroupRadiov-model="searchModel.indicatorScreening":options="dict.indicatorScreening&qu…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

软硬件架构分层总结

一、前言 软件系统很多架构图我们经常看到是这样的三段 就是这三段就可以演化出很多层 二、硬件架构分层 硬件层&#xff0c;基本是计算机硬件的体系结构&#xff0c;包括硬盘设备&#xff0c;cpu&#xff0c;内存&#xff0c;控制器&#xff0c;运算器&#xff0c;寄存器&am…

Stream流式处理

Stream流式处理&#xff1a; 建立在Lambda表达式基础上的多数据处理技术。 可以对集合进行迭代、去重、筛选、排序、聚合等处理&#xff0c;极大的简化了代码量。 Stream常用方法 Stream流对象的五种创建方式 //基于数组 String[] arr {"a","b","c…