数据结构实验-哈夫曼编码_待编码数据-程序员宅基地

技术标签: c++  数据结构  

实验目的:

(1) 掌握二叉树的定义;

(2) 掌握哈夫曼树和哈夫曼编码算法的实现。

实验内容:

实现一个哈夫曼编码系统,系统包括以下功能:

(1) 字符信息统计:读取待编码的源文件SourceFile.txt,统计出现的字符及其频率。

附:SourceFile.txt文件内容为

U ARE THE BEST IN MY HEART

(2) 建立哈夫曼树:根据统计结果建立哈夫曼树。

(3) 建立哈夫曼码表:利用得到的哈夫曼树,将各字符对应的编码表保存在文件Code.txt中。

(4) 对源文件进行编码:根据哈夫曼码表,将SourceFile.txt中的字符转换成相应的编码文件ResultFile.txt。

实现提示:

(1) 字符信息统计:假设源文件SourceFile.txt中的字符只有大小写英文字母(同一个字母的大小写看作一个字符),则字符统计算法的实现过程可以归纳为:先定义一个含有26个元素的整形数组,用来存储各个字母出现的次数,最后还要排除其中出现次数为0的数组元素。

(2) 建立哈夫曼树:参考教材算法5.10,补充函数Select的实现。

(3) 建立哈夫曼码表:参考教材算法5.11,将编译表HC中的内容写到文件Code.txt中。

(4) 对源文件进行编码:依次读入文件SourceFile.txt中的字符 c,在编码表 HC 中找到此字符,将字符c转换为编码表中存放的编码串,写入编码文件ResultFile.txt中,直到所有的字符处理完毕为止。

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<cstdio>
#include<fstream>
#include<string>
using namespace std;
typedef struct{
   
    
	int weight;
	int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
int a[24 + 1], b[24 + 1];
char c[24 + 1];
void Select(HuffmanTree &HT, int n, int &s1, int &s2){
   
    
	for (int i = 1; i <= n; i++)
		if (HT[i].parent == 0 && s1 == 0) {
   
     s1 = i; break; }
	for (int i = 1; i 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_14813265/article/details/105784139

智能推荐

SuperSocket 一个轻量级可扩展 Socket 开发框架_super socket-程序员宅基地

文章浏览阅读461次,点赞7次,收藏8次。不用多说这是迄今为止用过最好用的.Net领域Socket开发框架,从Photon 脱坑之后,一直用它来搭建游戏服务器,相伴多年经历了多个游戏和工控项目的检验,简单易上手,功能应有尽有,强烈推荐。可以通过NuGet进行安装。_super socket

vue开发环境配置(node多版本切换,nvm安装)_node版本切换-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏27次。最近在依赖问题上由于我安装的node版本适配性不全面,因为是在云内断网开发,使用不了nvm工具)有时候会因为node的版本过高或者是太低用命令启动时候而报错,试了一下是否可以安装一个高版本和低版本的node在一个系统中,你如果需要高版本的切换高版本的node,如果需要低版本的切换低版本的node,这样这个问题就会完美解决了。_node版本切换

深度可分离卷积(Depthwise Separable Convolution)_深度可分离卷积的优点-程序员宅基地

文章浏览阅读1.3k次。深度可分离卷积(Depthwise Separable Convolution)是一种卷积神经网络中常用的卷积操作,它在减少计算量的同时保持了较好的特征提取能力,因此被广泛用于轻量化的模型设计中。标准卷积使用一个卷积核对输入数据进行卷积,而深度可分离卷积将卷积操作分解为深度卷积和逐点卷积,从而显著减少了参数量。深度卷积只使用一个卷积核对输入通道逐通道进行卷积,逐点卷积使用1x1的卷积核进行通道之间的混合。深度卷积是在输入的每个通道上分别应用卷积核,生成相同数量的通道,然后将这些通道按通道维度进行堆叠。_深度可分离卷积的优点

〖产品思维训练白宝书 - 产品思维认知篇⑩〗- 产品经理 的思维方式对我们有着什么样的启发_管理思维对具体工作的作用-程序员宅基地

文章浏览阅读3.1w次,点赞11次,收藏6次。今天这一章节就来和各位小伙伴聊一聊,"产品经理" 从工作中总结出来的思考问题的角度,尤其是一些思维方式对于我们普通人来说都具有哪些启发。_管理思维对具体工作的作用

【论文Word排版】使用多级列表设置论文序号_序号1.1 1.2怎么排的-程序员宅基地

文章浏览阅读1.4k次。使用多级列表设置论文序号_序号1.1 1.2怎么排的

“自动获取IP地址”和“使用固定IP地址”的区别是什么?_无线网固定ip和自动分配有啥区别-程序员宅基地

文章浏览阅读8.5k次。自动获取IP地址是动态IP,是通过DHCP来获取IP地址,每次上网这个IP都不一样,在IP地址租期满后就有可能会换IP地址了。 使用固定IP地址是静态IP,是自己指定一个IP地址,ISP随时可以到你家查看。手动设置IP地址有个好处,就是一旦设定好后在不更改的情况下IP地址是固定的。 DHCP介绍:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应..._无线网固定ip和自动分配有啥区别

随便推点

【python】二维数组按照某行或某列排序(numpy lexsort)_numpy 二维数组排序-程序员宅基地

文章浏览阅读6.4w次,点赞23次,收藏130次。曾经以为排序只能使用list的sort函数,后来发现array的排序实现方法也有很多。List1、一维数组2、二维数组无论是一维数组还是二维数组都能通过 list 自带的 sort() 函数进行更新,或者直接调用sorted()方法即可。import numpy as npa = [3,4,5,1,2,3]b = [[3,4,5],[2,3,4]]c = [[3,4,..._numpy 二维数组排序

关于mybatis-plus写自定义方法(自定义sql)_mybatisplus自定义方法-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏7次。简介:本文讲解,在mybatis-plus中如果不存在某个方法,如何通过自定义的方式,自己写一个。_mybatisplus自定义方法

UR机器人数据包解析(python与C++实现)_ur机器人包-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏23次。一、与UR机器人进行通讯如果还没有完成电脑与UR机器人的通讯,可以参考这个博客(https://blog.csdn.net/qq_41685265/article/details/104327982)二、数据包解释每一个UR机器人对应的软件手册上边是有机器人返回的包中各数据位代表什么以及每个占多少位的空间的,如下:左边一列是UR机器人的各个参数,后边是类型,包括占用几个..._ur机器人包

从零开始:C++如何实现Kafka生产者客户端_c++ kafka-程序员宅基地

文章浏览阅读3.6k次,点赞7次,收藏31次。一、Kafka 生产者的逻辑。二、Kafka 的C++ API。三、Kafka 生产者客户端开发。_c++ kafka

导入Unity 3D场景后所有物体变成白色(材质丢失)_unity道具拖进去发白-程序员宅基地

文章浏览阅读1.5w次。Unity 3D在导入场景或者导入某个3D模型时会出现材质丢失的情况。如下图中右侧白色部分:找到材质丢失的物体,在Inspector面板重新添加材质。 That's all ...._unity道具拖进去发白

034CSS3盒子模型大小计算方法_css一个属性盒子模型自动计算-程序员宅基地

文章浏览阅读1.3k次。一、分类CSS3 中可以通过 box-sizing属性 来指定盒子模型大小的计算方法,有2个值:即可指定为 content-box、border-box,这样我们计算盒子大小的方式就发生了改变。可以分成两种情况:1. box-sizing: content-box 盒子大小为 width + padding + border (以前默认的)2. box-sizing: border-box 盒子大小为 width如果盒子模型我们改为了box-sizing: border-box , 那paddi_css一个属性盒子模型自动计算

推荐文章

热门文章

相关标签