赫夫曼树 | 实战演练

news2024/11/16 13:57:27

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

二、输入描述

三、输出描述

四、测试样例

五、解题思路

六、代码实现

七、时间复杂度


本文是针对【数据结构和算法】超详细,超多图解,赫夫曼树详解 中实战演练题目的讲解,下面来详细讲解 POJ Entropy。

一、题目描述

原文题目较长,这里总结如下:

熵编码器是一种数据编码方法,通过对删除了“浪费”或“额外”信息的消息进行编码来实现无损数据压缩。有两种编码方式:

(1)固定长度编码:用 ASCII 编码的英文文本具有高度的熵,因为所有字符都使用相同的位数(8位)进行编码。

(2)用赫(哈)夫曼编码形式编码。

例如:考虑文本“AAAAA BCD”。使用ASCII编码,需要64位(每个字符 8 位,8个字符,8 * 8 = 64)。哈夫曼编码为将“A”与“0”编码,将“B”与“10”编码,“C”与“110”编码,以及将“D”与“111”编码。那么,字符串 “AAAAABCD” 需要 13 位,编码为“0000010110111”。压缩比为 4.9 : 1。

二、输入描述

输入文件将包含文本字符串列表,每行一个。文本字符串将仅包含大写字母数字字符和下划线(用于代替空格)。

输入的结束将包含一行,该行仅包含单词 “END” 作为文本字符串,此行不处理。

三、输出描述

对于输入中的每个文本字符串,输出 8 位 ASCII 编码的位长度、最佳无前缀可变长度编码的位长以及精确到小数点一位的压缩比。

四、测试样例

输入:

AAAAABCD
THE_CAT_IN_THE_HAT
END

输出:

64 13 4.9
144 51 2.8

样例一:字符串 “AAAAABCD” 通过 8 位 ASCII 编码长度为 64 位 (8 * 8 = 64),最佳无前缀可变长度编码(哈夫曼编码)为 13 位,压缩比为 64/13 约等于 4.9。

样例二:字符串 “THE_CAT_IN_THE_HAT” 通过 8 位 ASCII 编码长度为 144 位 (18 * 8 = 144),最贱无前缀可变长度编码(哈夫曼编码)为 51 位,压缩比 144/51 = 2.8。

五、解题思路

本题是赫(哈)夫曼编码的简单应用,本题首先需要计算出 8 位 ASCII 编码需要的位数,需要位数 = 字符串长度 * 8。

然后,就是赫(哈)夫曼树的应用了,步骤如下所示:

(1)统计每个单词出现的频率,可以先排序一下,然后遍历一遍字符串统计;

(2)模拟赫(哈)夫曼树建立过程,统计编码需要的位数。

六、代码实现

代码实现如下所示。

#include<iostream>
#include<queue>
#include<string>
#include<iomanip>
#include<algorithm>
using namespace std;
int main()
{
	string str;
	// C++ 优先队列
	priority_queue< int,vector<int>,greater<int> > Q;
	while(cin>>str && str != "END") {
		sort(str.begin(), str.end()); //排序后,相同字符相邻

		//统计每个字符出现的频次,并放入优先队列
		int num = 1;
		int n = str.size();
		for(int i = 0; i < n; ++i) {
			if(str[i] != str[i + 1]) {
				Q.push(num);
				num = 1;
			} else {
				++num;
			}
		}

		int ans = 0; // 用于保存哈夫曼编码总长度
        // 处理只有一种字符的特殊情况
		if(Q.size() == 1) ans = Q.top();
		while(Q.size() > 1) {
            // 模拟建立哈夫曼树,取出两个最小的
			int a = Q.top();
			Q.pop();
			int b = Q.top();
			Q.pop();
			Q.push(a + b);
			ans += (a + b);
		}
		Q.pop();
		cout<<n*8<<" "<<ans<<" "<<fixed<<setprecision(1)<<n*8.0/ans<<endl;
	}
	return 0;
}

在 POJ 提交 AC 截图如下所示。

AC 截图

七、时间复杂度

时间复杂度:O(nlogn + mlogm)

其中,n 表示字符的个数,m 表示字符的种类,对所有字符串排序的时间复杂度为 O(nlogn),通过优先队列进行赫(哈)夫曼编码的时间复杂度为O(mlogm)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


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

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

相关文章

关于动漫的HTML网页设计:期末前端web大作业——海贼王基地(6个页面)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

QT—5种标准对话框使用详解

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者简洁的用户交互。所谓标准对话框&#xff0c;是 Qt 内置的一系列对话框&#xff…

kafka问题总结

kafka问题总结【1】Kafka 都有哪些特点&#xff1f;【2】为什么要使用 kafka&#xff0c;为什么要使用消息队列&#xff1f;【2】kafka的使用场景【3】Kafka 的设计架构【4】kafka分区的目的【5】Kafka 是如何做到消息的有序性&#xff1f;【6】Kafka 的高可靠性是怎么实现的&a…

【操作系统-总论】发展历程、体系结构、虚拟机

文章目录1 操作系统的发展历程1.1 手工操作阶段1.2 批处理阶段1.2.1 单道批处理系统&#xff08;单道程序系统&#xff09;1.2.2 多道批处理系统&#xff08;多道程序系统&#xff09;1.3 分时操作系统1.4 实时操作系统2 操作系统的体系结构3 虚拟机1 操作系统的发展历程 1.1 …

Nginx教程(3)—负载均衡

文章目录3.1 负载均衡-轮询3.2 负载均衡-加权轮询3.3 upstream指令参数3.4 使用JMeter测试集群3.5 负载均衡之IP_hash3.6 一致性hash算法3.7 Nginx控制浏览器缓存3.8 Nginx反向代理缓存Nginx教程一 Nginx教程二 3.1 负载均衡-轮询 轮询是Nginx默认使用的策略&#xff0c;轮询算…

jmeter做压测性能调优:SSL上下文切换导致SSL频繁握手【杭州多测师_王sir】【杭州多测师】...

一、问题背景在使用 JMeter 压测时&#xff0c;发现同一后端服务&#xff0c;在单机 500 并发下&#xff0c;HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低&#xff0c;因此怀疑性能瓶颈在 JMeter 施压客户端。二、问题分析切入点&#xff1a;垃…

【无标题】大模型时代,视觉推理任务竟然只用语言数据也能学习

原文链接&#xff1a;https://www.techbeat.net/article-info?id4394 作者&#xff1a;seven_ 要让AI模型真正具备智能感知和认知的功能&#xff0c;我们就不得不把视觉分析和自然语言理解二者结合起来进行研究。AI大模型社区的成长为我们带来了很多极具想象力和创造力的新应用…

基于FPGA通过1Gb以太网低延迟传输专业级4K AV信号解决方案

ME10 SoC是全栈AV Over IP片上IP系统(SoC)&#xff0c;通过1Gb网络传输HDMI2.0 4K 4:4:4 的视频、音频和控制数据&#xff0c;ME10 SoC采用一个小的23 x 23毫米BGA封装。ME10主要特色为互通性和优越性能。 IPMX是AV的开放标准和规范的集合&#xff0c;专为专业AV市场开发的IP。…

【并发编程七】C++进程通信——套接字(socket)_80行代码实现一个聊天软件

【并发编程七】进程通信——套接字&#xff08;socket&#xff09;_80行代码实现一个聊天软件一、简介二、相关知识介绍1、winsock1.h、winsock2.h2、如何使用ws2_32.dll3、WSAStartup() 函数4、socket5、bind5、listen6、accept7、connect三、聊天软件的代码如下1、服务端2、客…

QT系列第5节 QT中常用输入控件

QT中经常利用控件来获取用户输入数据&#xff0c;本篇将介绍常用的用户输入控件 目录 (1) QSpinBox (2) QDoubleSpinBox &#xff08;3&#xff09;QSlider &#xff08;4&#xff09; QScrollBar &#xff08;5&#xff09;QProgressBar &#xff08;6&#xff09;QDia…

@MapperScan原理探究

1. 前言 MyBatis在整合Spring的时候&#xff0c;只需要加如下注解&#xff0c;就可以将Mapper实例注册到IOC容器交给Spring管理&#xff0c;它是怎么做到的呢&#xff1f;&#xff1f;&#xff1f; MapperScan("com.xxx.mapper")提出几个问题&#xff1a; Mapper接…

Snipaste的使用

Snipaste截屏软件的使用&#xff1a; 1、开始截屏 第一种方式&#xff1a;快捷键 &#xff08;默认是F1&#xff09;也就是说按一下F1键就会进入截屏状态。 第二种方式&#xff1a;点击软件在任务栏上的图标。 2、选定截屏区域&#xff1a; 进入截屏状态后移动鼠标&#x…

绩效考核管理方案

第一部分 总 则 第一条&#xff1a;目的 1、通过绩效考核&#xff0c;传递组织目标和压力&#xff0c;促使员工提高工作绩效&#xff0c;达到“培养员工、提高员工的工作能力、纠正员工偏差、使之更好地为公司服务&#xff0c;达到公司与个人之间的双赢”的目的。 2、加强公司的…

四、fs文件系统模块

fs模块是Node.js官方提供用来操作文件的模块&#xff0c;属于核心模块&#xff0c;提供了一些列的方法和属性&#xff0c;用来满足用户的操作需求&#xff1b; 引入fs模块 const fs require(fs); fs.readFile() 读取 读取指定的内容&#xff0c;fs.readFile(path[&#xff…

图文排版 之 line-height

图文排版 之 line-height 设置行盒子的高度. line-height 经常被用来设置多行文本的行间距. 对于块级元素, line-height 制定了行盒子的最小高度. 对于非替换的内联元素, line-height 的值用来计算行盒子的高度. 一般来说, 大家都知道一个 div 的高度默认是由其子元素撑起的, …

史上最全 Java 高频面试合集,命中率高达 95%

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;其中概括的知识点有&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis、MySQL、Spring、S…

现代控制理论

系统的状态空间表达式的建立 建立系统状态空间表达式的三种方法 &#xff08;1&#xff09;根据系统的方框图列写 &#xff08;2&#xff09;从系统的基本原理推导 &#xff08;3&#xff09;根据传递函数或者高阶微分方程实现 方框图法 有些系统的系统机理还没搞清楚可以使…

nodejs+vue高校教室管理系统

摘 要 1 1 系统概述 4 1.1研究背景 4 1.2研究现状 4 1.3主要内容 5 2 系统开发环境 6 2.3 MySql数据库 6 2.4 B/S结构 7 3 需求分析 8 3.1技术可行性&#xff1a;技术背景 8 3.2经济可行性 8 3.3操作可行性 8 3.4系统设计规则 9 3.5系统流程和逻辑 9 4系统概要设计 13 4.1 概…

Delaunay三角网之分治算法

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Delaunay三角网现有的构网算法有很多种,有学者曾对其中一些算法进行了调查和评估(如下图所示)。结果表明,在少量点时,Lawson的增量插入算法、Lee和Schachter的分治算法以及Fortune的平面扫描算法在速度上大致相…

Hexo+stun主题+Gitee5分钟快速搭建你的个人Blog

环境配置 首先要下载Node.js&#xff0c;然后安装Git&#xff0c;接着注册码云&#xff0c;最后安装Hexo&#xff0c;Hexo安装命令行(cmd 或 gitbash): npm install hexo-cli -g速度慢可以先改一下安装源: npm config set registry https://registry.npm.taobao.orgHexo搭建 目…