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

news2024/11/15 20:05:21

哈夫曼树与哈夫曼编码

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

分数 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.coloradmin.cn/o/1271223.html

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

相关文章

应用场景丨社区建筑结构健康监测系统

随着社区的快速发展&#xff0c;社区建筑的结构安全与健康问题日益受到广泛关注。考虑到社区建筑的特点&#xff0c;如人口密集、结构复杂等&#xff0c;建筑结构健康监测系统的应用显得尤为重要。 社区建筑结构健康监测系统的效果 1. 结构安全性提升&#xff1a;通过实时监测…

企业软件的分类有哪些|app小程序定制开发

企业软件的分类有哪些|app小程序定制开发 企业软件是指为了满足企业运营和管理需求而开发的软件系统。根据不同的功能和应用领域&#xff0c;企业软件可以分为以下几个分类&#xff1a; 1. 企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;软…

什么是灯塔工厂?灯塔工厂的作用?

什么是灯塔工厂&#xff1f; "灯塔工厂"概念源于德国的工业4.0战略&#xff0c;又称“工业4.0示范工厂”或“标杆工厂”&#xff0c;代表工业领域顶级的智能制造能力。2018年&#xff0c;由世界经济论坛和麦肯锡共同推出。 灯塔工厂是通过数字化、网络化和智能化手…

国产CPU计算平台选型指南

信创&#xff0c;这两年已经不是什么新鲜词了&#xff0c;随着29号文、79号文的实施落地&#xff0c;信创产品加速从党政走向八大关基行业。 八大行业中&#xff0c;金融、教育、电信、石油等企业步伐更大&#xff0c;很多企业已经从窗口业务、日常办公这类轻量应用场景&#…

网络安全应该怎么学?(0基础小白)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

佳易王棋牌室灯控计时计费管理系统软件教程,佳易王棋牌室内零食怎么计费

佳易王棋牌室灯控计时计费管理系统软件教程&#xff0c;佳易王棋牌室内零食怎么计费 一、佳易王棋牌桌球计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;…

2023年【P气瓶充装】找解析及P气瓶充装复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装找解析参考答案及P气瓶充装考试试题解析是安全生产模拟考试一点通题库老师及P气瓶充装操作证已考过的学员汇总&#xff0c;相对有效帮助P气瓶充装复审模拟考试学员顺利通过考试。 1、【多选题】CNG双燃料汽车…

软件测试面试经历和上岸后工作分享

哈喽、因为最近很多小伙伴私信问我的比较多&#xff0c;今天就专门说下&#xff0c;之前为甚转行和怎么选机构就不和大家细说了&#xff0c;之前的文章和视频也都有提到过。 今天主要是和大家说下自己转行后的感受和面试时候的一些经历&#xff0c;希望能给正在转行&#xff0c…

轻松搭建Nextcloud私有云盘并实现公网访问本地资源

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

重载、重写、重定义的辨析

C重载、重写、重定义 重载、重写、重定义对比一、重载&#xff08;overload&#xff09;二、重写 / 覆盖&#xff08;override&#xff09;三、重定义 / 隐藏&#xff08;redefining&#xff09; * 为什么在虚函数中不能使用 static 关键字&#xff1f;动态绑定&#xff08;Dyn…

拼图游戏制作

2.创建用户界面 package domain; /** * ClassName: User * Author: Kox * Data: 2023/2/2 * Sketch: */ public class User { private String username; private String password; public User() { } public User(String username, String p…

Vue中的组件和插件

一、组件 组件是Vue中最核心的概念之一&#xff0c;它可以把一个页面拆分成多个独立的、可复用的部分。组件通常包含了自己的模板、样式和逻辑&#xff0c;用于封装一个特定的功能或界面。Vue的组件有单文件组件和普通组件两种类型&#xff0c;可以通过Vue.component或Vue.ext…

配电房综合监控系统

配电房综合监控系统是一种集成了实时监控、数据采集、远程控制等多功能的系统&#xff0c;用于对配电房进行全方位的监测和管理。 力安科技配电室综合监控系统依托电易云-智慧电力物联网&#xff0c;实现配电室环境监测、有害气体监测、安防监控、采暖通风、门禁、灯光、风机、…

挂耳式蓝牙耳机性价比排行榜,看完这篇知道如何选

随着科技的发展&#xff0c;蓝牙耳机早已成为我们生活的一部分&#xff0c;但市场上的选择实在太多&#xff0c;让人眼花缭乱&#xff0c;一不小心就会选错踩坑&#xff0c;消费者往往会陷入选择困境&#xff0c;为了帮助大家更好地了解挂耳式蓝牙耳机的性价比表现&#xff0c;…

云专线:安全、高速的云访问专属连接通道

随着云计算技术的急速发展&#xff0c;各行业IT体系已步入“云”时代&#xff0c;完全本地化的部署方案鲜少为企业所采用。现今企业已或多或少地将业务系统部署在公有云、私有云或者混合云上&#xff0c;以驱动企业流程重构和业务创新&#xff0c;提升管理效率&#xff0c;实现…

2023年,再不跳槽,就晚了···

以 BAT 为代表的互联网大厂&#xff0c;无论是薪资待遇、还是平台和福利&#xff0c;都一直是求职者眼中的香饽饽&#xff0c;“大厂经历” 在国内就业环境中无异于一块金子招牌。 很多想进大厂的朋友都在问&#xff0c;该怎么备战 2023年&#xff1f; 为此我专门打造了一份《…

爬虫从入门到精通(21) |字体加密通杀方案

文章目录 一、了解什么是字体加密二、Python打开字体加密文件三、字体加密的通杀1.静态的字体文件固定顺序的字体2.其他动态变化情况 一、了解什么是字体加密 字体加密是页面和前端字体文件想配合完成的一个反爬策略。通过css对其中一些重要数据进行加密&#xff0c;使我们在代…

深度学习毕设项目 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&a…

CRM与ERP如何协同服务于企业

在当今的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;和 Enterprise Resource Planning&#xff08;ERP&#xff09;是两个不可或缺的系统。它们各自独立&#xff0c;但也可以协同工作&#xff0c;以提供更高效、更全面的企业解决方案。这种协同作用可以在销…

使用功率MOSFET常见的一些问题(三)

使用功率MOSFET常见的一些问题&#xff08;三&#xff09; 1.体二极管2.封装和PCB布局注意事项3.MOS并联 1.体二极管 体二极管是 MOSFET 结构中的固有部分&#xff0c;由 p-body 层和 n-epi 层之间的 p-n 结形成&#xff0c;如图所示。功率MOSFET 是三端器件&#xff0c;其本体…