7-1 哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码

    • 题目描述
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例

分数 30
作者 伍建全
单位 重庆科技学院

题目描述

哈夫曼树(Huffman Tree)又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1L1+W2L2+W3L3+…+WnLn),N个权值Wi(i=1,2,…n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,…n)。可以证明哈夫曼树的WPL是最小的。

在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制,可分别用000、001、010、011、100、101对“A,E,R,T,F,D”进行编码发送,当对方接收报文时再按照三位一分进行译码。显然编码的长度取决报文中不同字符的个数。若报文中可能出现26个不同字符,则固定编码长度为5。然而,传送报文时总是希望总长度尽可能短。在实际应用中,各个字符的出现频度或使用次数是不相同的,如A、B、C的使用频率远远高于X、Y、Z,自然会想到设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。

为使不等长编码为前缀编码(即要求一个字符的编码不能是另一个字符编码的前缀),可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度效果上就是传送报文的最短长度。因此,求传送报文的最短长度问题转化为求由字符集中的所有字符作为叶子结点,由字符出现频率作为其权值所产生的哈夫曼树的问题。利用哈夫曼树来设计二进制的前缀编码,既满足前缀编码的条件,又保证报文编码总长最短。

本题要求从键盘输入若干电文所用符号及其出现的频率,然后构造哈夫曼树,从而输出哈夫曼编码。

注意:
为了保证得到唯一的哈夫曼树,本题规定在构造哈夫曼树时,左孩子结点权值不大于右孩子结点权值。如权值相等,则先选优先级队列中先出队的节点作为左孩子。编码时,左分支取“0”,右分支取“1”。

输入格式

输入有3行。
第1行:符号个数n(2~20)。

第2行:一个不含空格的字符串。记录着本题的符号表。我们约定符号都是单个的小写英文字母,且从字符‘a’开始顺序出现。也就是说,如果 n 为 2 ,则符号表为 ab ;如果 n 为 6,则符号为 abcdef;以此类推。

第3行:各符号出现频率(用乘以100后的整数),用空格分隔。

输出格式

先输出构造的哈夫曼树带权路径长度。
接下来输出n行,每行是一个字符和该字符对应的哈夫曼编码。字符按字典顺序输出。

字符和哈夫曼编码之间以冒号分隔。

例如:

a:10

b:110

输入样例

在这里给出一组输入。

6
abcdef
15 19 10 6 38 12

输出样例

在这里给出相应的输出。

240
a:101
b:111
c:1101
d:1100
e:0
f:100

提示:
以上示例数据,按题目要求建立的Huffman Tree如下图
在这里插入图片描述

#include <iostream>
#include <queue>
#include <map>using namespace std;const int N = 110;struct node
{int id, w;char op;bool operator < (const node &a) const{if (a.w == w) return op < a.op;return w > a.w;}
};struct node1
{int id, w;char op;int l, r, p;
}h[N];int n;
string s;
map<char, string>mp;void init()
{for (int i = 0; i < n - 1; i ++ )h[i].p = h[i].l = h[i].r = -1;
}int main()
{init();cin >> n >> s;priority_queue<node, vector<node> >q;for (int i = 0; i < n; i ++ ){int x;cin >> x;q.push({i, x, s[i]});}int sum = 0;for (int i = n; i < 2 * n - 1; i ++ ){auto x = q.top();q.pop();auto y = q.top();q.pop();if(x.w == y.w) swap(x, y);h[i].l = x.id, h[i].r = y.id;h[x.id].p = h[y.id].p = i;h[i].id = i;h[i].w = x.w + y.w;q.push({i, h[i].w, '-'});sum += h[i].w;}cout << sum << endl;for (int i = 0; i < n; i ++ ){h[n * 2 - 2].p = -1;string s1 = "";int pre = i;int pp = h[i].p;while (pp != -1){int ll = h[pp].l;int rr = h[pp].r;if(ll == pre) s1 = "0" + s1;else s1 = "1" + s1;pre = pp;pp = h[pp].p;}mp[s[i]] = s1;}for (auto it : mp)cout << it.first << ':' << it.second << endl;return 0;
}

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

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

相关文章

为什么要在项目中使用TypeScript?

随着越来越多的开发人员采用TypeScript&#xff0c;人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力&#xff0c;但在过去十年&#xff0c;它迅速成为一种广泛使用的编程语言。 以下介绍如何使用TypeScript以及它给开发人员带来的一些好…

堆在排序中的应用

堆排序 1、堆排序原理 堆排序是利用到了堆这种数据结构&#xff0c;我们首先回顾一下二叉堆的特性&#xff1a; 最大堆的堆顶是整个堆中的最大元素。最小堆的堆顶是整个堆中的最小元素。 以最大堆为例&#xff0c;如果删除一个最大堆的堆顶&#xff08;并不是完全删除&…

如何利用树莓派与Nginx结合内网穿透服务实现远程访问内部站点——“cpolar内网穿透”

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用语法详解

文章目录 1️⃣ TypeScript常用讲解1.1 使用1.2 字符串1.3 数字1.3 布尔1.4 数组1.5 元组1.6 枚举1.7 any1.8 void1.9 object1.10 函数指定返回值的类型1.11 联合类型1.12 类型断言1.13 接口1.14 函数类型1.15 类类型1.16 泛型 2️⃣ 类2.1 类的基本写法2.2 类的继承2.3 类的修…

数据结构 | 二叉树的概念及前中后序遍历

数据结构 | 二叉树的概念及前中后序遍历 文章目录 数据结构 | 二叉树的概念及前中后序遍历一、树概念及结构1.1 树的相关概念 二、树的表示2.2 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 三、二叉树概念及结构3.1 二叉树的基本概念3.2 二叉树的结构&a…

文档理解的新时代:LayOutLM模型的全方位解读

一、引言 在现代文档处理和信息提取领域&#xff0c;机器学习模型的作用日益凸显。特别是在自然语言处理&#xff08;NLP&#xff09;技术快速发展的背景下&#xff0c;如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息&#xff0c;还包括布局、图…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NX二次开发UF_MTX2_copy 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_copy Defined in: uf_mtx.h void UF_MTX2_copy(const double mtx_src [ 4 ] , double mtx_dst [ 4 ] ) overview 概述 Copies the 2x2 matrix elements from the source m…

快速排序算法的代码及算法思想

快速排序&#xff08;Quick Sort&#xff09;是一种常用的排序算法&#xff0c;他的时间复杂度为O(nlogn) 算法思想: 通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据小&#xff0c;然后再对这两部分数据分别进行快速排…

模糊C均值聚类(Fuzzy C-means clustering,FCM)的基本概念,详细流程以及广泛应用!

文章目录 1.基本概念2. FCM的详细流程3.FCM的应用 1.基本概念 模糊C均值聚类&#xff08;Fuzzy C-means clustering&#xff0c;FCM&#xff09;是一种软聚类方法&#xff0c;它允许数据点属于多个聚类中心&#xff0c;每个聚类中心都有一个权重。与传统的硬聚类方法&#xff…

Visual Studio 2022分析C#程序内存泄漏

背景 最近我们的项目出现了内存激增的情况&#xff0c;初次探讨&#xff0c;我们发现和机器人发生通信之后&#xff0c;内存会缓慢上升&#xff0c;直到系统崩溃。 例子 由于只是介绍一个简单的方案&#xff0c;所以就写一个比较简单的例子来演示了&#xff0c;代码如下&…

五要素超声波气象站-气象站小百科

随着科技的发展&#xff0c;人们对气象监测的需求也越来越高。为了满足这一需求&#xff0c;一款全新的五要素超声波气象站应运而生。这款气象站不仅具有高精度的测量能力&#xff0c;而且能够实时监测天气变化&#xff0c;为人们提供准确的气象数据。 一、实时监测&#xff0…

python循环语句和函数

1.使用for循环打印9*9乘法表 for i in range(1, 10):for j in range(1, i1):print(i, "*", j, "", i*j, end"\t")print()结果&#xff1a; 2.使用while循环打印9*9乘法表 i 1 while i < 10:j 1while j < i1:print(i, "*", j…

koa2项目中封装log4js日志输出

1.日志输出到控制台 npm i log4js -D 封装log4js文件&#xff1a; const log4js require("log4js"); const logger log4js.getLogger();const levels {trace: log4js.levels.TRACE,debug: log4js.levels.DEBUG,info: log4js.levels.INFO,warn: log4js.levels.WAR…

分享83个简历竞聘PPT,总有一款适合您

分享83个简历竞聘PPT&#xff0c;总有一款适合您 83个简历竞聘PPT下载链接&#xff1a;https://pan.baidu.com/s/1iybRAisgWgXhelE1tGpzBw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

国标GB28181协议/RTSP视频监控汇聚平台EasyCVR(V.3.4)页面UI大更新

为提高用户体验&#xff0c;增强平台功能&#xff0c;旭帆科技的Easy系列平台也在不断优化更新中。在最新的EasyCVR&#xff08;V.3.4&#xff09;中&#xff0c;其最显著的区别即为首页UI的调整。 其亮点是在【配置中心】-【基础配置】-【展示信息】中&#xff0c;首页UI可分…

只有stm32基础,学嵌入式linux得几年?

只有stm32基础&#xff0c;学嵌入式linux得几年&#xff1f; 你这几句话基本把好几个方向都说了个遍&#xff0c;但是实际你没有这么多精力 这里32的基础意义不大&#xff0c;主要是C语言基础和之前项目中的经验&#xff0c;要是这俩个都不错&#xff0c;你可以直接上手 linux&…

MySQL 插入数据报错 Incorrect string value

当在sys_dict_data表中执行插入语句&#xff1b; insert into sys_dict_data values(1, 1, 男, 0, sys_user_sex, , , Y, 0, admin, sysdate(), , null, 性别男);报错信息如下&#xff1a; insert into sys_dict_data values(1, 1, 男, …

ABAP2XLSX 的安装和demo

ABAP2XLSX 是一个git上面的很好用的工具&#xff0c;它可以帮助abaper们更方便&#xff0c;更简单的生成各种各样复杂的自定义的excel&#xff0c;以满足各企业的信息化建设 在安装这个之前&#xff0c;请先查看之前的博客&#xff0c;去安装abapgit abap2xlsx地址&#xff1…

源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。yum install mysql-server --nogpgcheck