Huffman树实现文件压缩

【问题描述】给定一个文件,文件由n个字符组成,但他们出现的频度不相同。要求对该文件中的字符集构造哈夫曼树,并计算编码后的文件长度。
【输入形式】

输入的第1行有1个数字n,表示文件中总的字符个数。接下来1行中有n个数字,分别表示n个字符出现的频度。
【输出形式】

输出1行包含1个数字,表示使用哈夫曼编码后该文件的长度。
【样例输入】

5

20 7 10 4 18
【样例输出】

129
【样例说明】

使用哈夫曼编码后,各字符的编码长度分别为2 3 2 3 2,文件长度为2*20+3*7+2*10+3*4+2*18=129

注意事项:

①已经在结构体内部重载了"<",在声明堆(优先队列)时不需要再使用less,greater了

②在堆中取出结点时,注意每次都要new 出一个新的结点,而不是指向堆中的结点,因为堆中的结点的指针在函数执行完毕之后就释放了

错误的Huffman函数:

void Huffman() {for(int i = 1; i <= n; i++)printf("访问节点%d, value=%d\n", i, Huf[i].value);priority_queue <HuffmanNode> heap;for(int i = 1; i <= n; i++)heap.push(Huf[i]);priority_queue<HuffmanNode> tempheap = heap;while(tempheap.size()) {HuffmanNode t = tempheap.top();tempheap.pop();printf("heap:访问节点value=%d\n", t.value);}while(heap.size() > 1) {HuffmanNode* h1 = new HuffmanNode(heap.top());heap.pop();HuffmanNode* h2 = new HuffmanNode(heap.top());heap.pop();HuffmanNode t;t.value = h1->value + h2->value;t.LChild = h1;t.RChild = h2;printf("新构建结点t的左孩子的值为:%d, 右孩子的值为:%d\n", (t.LChild)->value, (t.RChild)->value);printf("value:取出的两个结点值为%d和%d, 新构建的结点t的值为%d\n", h1->value, h2->value, t.value);heap.push(t);}

正确代码: 

#include<iostream>
#include<queue>
using namespace std;
const int N=100;
int n,ans;
struct HuffmanNode
{int value,h;HuffmanNode* LChild,*RChild;bool operator<(const HuffmanNode &H)const{return value>H.value;}HuffmanNode():LChild(NULL),RChild(NULL),value(0),h(0) {}
}Huf[N];
void getHeight(HuffmanNode *root, int h) {if (root != NULL) {
//        printf("getHeight:访问节点value=%d\n", root->value);// 如果有左子树,递归处理左子树if (root->LChild != NULL) {getHeight(root->LChild, h + 1);}// 如果有右子树,递归处理右子树if (root->RChild != NULL) {getHeight(root->RChild, h + 1);}// 如果是叶子节点,设置深度if (root->LChild == NULL && root->RChild == NULL) {root->h = h;ans+=(root->value)*(root->h);
//            printf("叶子节点value=%d,深度=%d\n", root->value, root->h);}}
}void Huffman() {
//    for(int i = 1; i <= n; i++)
//        printf("访问节点%d, value=%d\n", i, Huf[i].value);priority_queue <HuffmanNode> heap;for(int i = 1; i <= n; i++)heap.push(Huf[i]);//    priority_queue<HuffmanNode> tempheap = heap;
//
//    while(tempheap.size()) {
//        HuffmanNode t = tempheap.top();
//        tempheap.pop();
//        printf("heap:访问节点value=%d\n", t.value);
//    }while(heap.size() > 1) {HuffmanNode* h1 = new HuffmanNode(heap.top());heap.pop();HuffmanNode* h2 = new HuffmanNode(heap.top());heap.pop();HuffmanNode t;t.value = h1->value + h2->value;t.LChild = h1;t.RChild = h2;
//        printf("取出的两个结点值为%d和%d, 新构建的结点t的值为%d\n", (t.LChild)->value, (t.RChild)->value);heap.push(t);}HuffmanNode t = heap.top();heap.pop();// 这里将 root 指向堆中的对象HuffmanNode* root = new HuffmanNode(t);getHeight(root, 0);// 记得释放动态分配的内存delete root;
}
/*
520 7 10 4 18
*/
int main()
{cin>>n;for(int i=1;i<=n;i++)scanf("%d",&Huf[i].value);Huffman();printf("%d\n",ans);return 0;
}

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

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

相关文章

跨境电商竞品分析:洞察市场,赢得先机的关键策略

在全球化日益加速的今天&#xff0c;跨境电商已经成为了企业拓展市场、提高销售额的重要手段。然而&#xff0c;跨境电商市场的竞争也日趋激烈&#xff0c;如何在众多竞争对手中脱颖而出&#xff0c;成为每个企业都面临的挑战&#xff1b;想要做到这点&#xff0c;了解竞品情况…

Apache Doris (六十一): Spark Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Spark Doris Connector…

vue3中状态管理库pinia的安装和使用方法介绍及和vuex的区别

Pinia 与 Vuex 一样&#xff0c;是作为 Vue 的“状态存储库”&#xff0c;用来实现 跨页面/组件 形式的数据状态共享。它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话&#xff0c;你可能会认为可以通过一行简单的 export const state reactive({}) 来共享一个全局状…

【Python】开始你的Python之旅(Anaconda、Pycharm、Jupyter)

Python工具准备 下载安装AnacondaPycharmJupyter Notebook 启动使用AnacondaPycharmJupyter Notebook 引言&#xff1a; 信息时代&#xff0c;计算机引领。人工智能&#xff0c;Python是基础。信息时代学习好Python乃是在人工智能时代的立足之本。 本文&#xff1a; 做好Pyth…

开发者必备的 Github 加速工具(截至2024年01月)

开始闲聊前&#xff0c;我要感谢大神小青龍总结的博文&#xff1a;作为程序员不得不知道的几款Github加速神器&#xff0c;给我们介绍了常用&#xff08;较为合规&#x1f604;&#xff09;的加速方法。毕竟 github 是开发者绕不过的宝库。 背景 我用 Github 将近12年&#x…

JS鼠标事件总结学习

首先我们先简单过一遍鼠标MouseEvent事件&#xff1a; click: 当鼠标单击元素时触发。dblclick: 当鼠标双击元素时触发。mousedown: 当按下鼠标按钮时触发。mouseup: 当释放鼠标按钮时触发。mousemove: 当鼠标指针在元素上移动时触发。mouseover: 当鼠标指针移动到元素上方时触…

C++精进之路之路(九)内存模型和名称空间

C鼓励程序员在开发程序时使用多个文件。一种有效的组织策略是&#xff0c;使用头文件来定义用户类型&#xff0c;为操纵用户类型的两数提供两数原型&#xff1a;并将两数定义放在一个独立的源代码文件中。头文件和源代码文代一起定义和实现了用户定义的类型及其使用方式。最后&…

初步认识架构分层

一般初创软件&#xff0c;为快速上线&#xff0c;几乎不考虑分层。但随业务越发复杂&#xff0c;就会导致逻辑复杂、模块相互依赖、代码扩展性差等各种问题。 架构分层迫在眉睫。 1 什么是架构分层? 软件工程中常见的设计方式&#xff0c;将整体系统拆分成N个层次&#xff0c;…

C#进制--2进制、10进制、16进制(Modbus通讯部分)详解

引言&#xff1a;最近接触了一些通讯方面信息&#xff0c;写个小结记录一下&#xff0c;即时更新 1.二进制数&#xff1a; 是计算技术中经常采用的一种数制。二进制数据是由0和1两个基本数码来表示的数。它的基数为2&#xff0c;进位规则是“逢二进一”&#xff0c;借位规则是…

软件测试错题集(黑盒、白盒测试)

所有判断题第二个选项是正确答案 1.[判断题] 不存在质量很高但可靠性很差的产品。 错 对 2.[判断题] 软件测试按照测试过程分类为黑盒、白盒测试。 对 错 3.[判断题] 从软件开发者的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑用户是否可接受该产品。 …

3D空间漫游技术的日趋成熟,让博物馆数字化大放异彩!

随着科技的飞速发展&#xff0c;互联网已经成为人们生活中不可或缺的一部分。在这个数字化时代&#xff0c;博物馆也紧跟时代潮流&#xff0c;将传统的实体博物馆与现代科技相结合&#xff0c;诞生了一种全新的博物馆形式——3D线上博物馆。这种新型博物馆凭借其独特的魅力&…

Flutter 三点三:Dart Stream

Stream Stream用于接收异步事件Stream 可以接收多个异步事件Stream.listen()方法返回StreamSubscription 可用于取消事件订阅&#xff0c;取消后&#xff0c;不再接收事件 基本使用 Stream.fromFutures([Future.delayed(Duration(seconds: 1),(){return "事件1";})…

SemCms外贸网站商城系统 SQL注入漏洞复现(CVE-2023-50563)

0x01 产品简介 SemCms是国内团队打造的专门针对外贸网站的开源CMS,主要用于外贸企业,兼容IE,Firefox等主流浏览器。建设商城性质的外贸网站,多语言(小语种)网站。 0x02 漏洞概述 SemCms外贸网站商城系统SEMCMS_Function.php 中的 AID 参数存在SQL注入漏洞,未经身份认…

数据库:基础SQL知识+SQL实验2

&#xff08;1&#xff09;基础知识&#xff1a; 1.JOIN&#xff08;连接&#xff09;&#xff1a; 连接操作用于根据指定的条件将两个或多个表中的数据行合并在一起。JOIN 可以根据不同的条件和方式执行&#xff0c;包括等值连接、不等值连接等。 &#xff08;1&#xff09…

自制Java镜像发布到dockerhub公网使用

文章目录 问题现象解决制作Java镜像发布使用 问题现象 书接上回&#xff0c;上周处理了一个docker问题&#xff0c;写了篇博客&#xff1a;自定义docker镜像&#xff0c;ubuntu安装命令并导出我们使用谷歌的jib插件打包&#xff0c;详情可以参考这篇文章&#xff1a;Spring Bo…

联想M7400加粉后如何清零

联想M7400黑白激光多功能打印一体机加粉后清零方法&#xff1a; 吴中函 加粉后&#xff0c;确保硒鼓已经被正确安装并且机器已经通电。 1、打开前盖&#xff0c;以便进行后续的操作。 2、按下“清除/返回”键&#xff0c;这会触发一个屏幕提示&#xff1a;提示内容为“更换…

ros2 ubuntu 20.04 安装 foxy

设置区域设置 确保您有一个支持UTF-8. 如果您处于最小环境&#xff08;例如 docker 容器&#xff09;中&#xff0c;则区域设置可能是最小的&#xff0c;例如POSIX. 我们使用以下设置进行测试。但是&#xff0c;如果您使用不同的 UTF-8 支持的区域设置&#xff0c;应该没问题。…

VM安装虚拟机及初始化操作

一、VM下载及暗转 虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;在实体计算机中能够完成的工作在虚拟机中都能够实现。VMware 是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的…

python毕设选题 - flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

463岛屿周长

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…