哈夫曼编码压缩文本应用(基于C++环境开发)

一次一小步之用C++实现Huffman文件压缩 首先介绍下Huffman算法:哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。明确几个概念:(主要来自高教出版的数据结构与算法,不想看的这里可以直接跳过,点这里) 结点 阅读详情

前言(迭代于2023/6/18)


大一下学期期末数据结构项目设计-哈夫曼编码压缩文本,目前这个项目仍有缺陷,不能正常地输出中文字符参与哈夫曼编码压缩文本运算;


 需求文档:



注意事项


读取文本文件时会发生打不开问题:

 这是因为打开的Txt文本的路径中带有了中文所以读取不了;


功能2-5中的显示:

Space -- 指代空格

LF -- 指代换行符


功能6中的读取注意事项:


功能6的哈夫曼编码表的书写规则如下: 

空格 00;


代码部分: 

#include <iostream>
#include <queue>
#include <unordered_map>
#include <string>
#include <fstream>
#include <windows.h>
#include <commdlg.h>
#include <conio.h>

using namespace std;

//-----------------------------------------------------------------------------------------------------------------------------
//全局变量

int key;//控制整体key事件
string text;//用于读取文本和哈夫曼压缩文本
string line;
int cnt = 0;//用于读取文本的字符数
unordered_map<string, char> codes; // 储存哈夫曼编码表//用于功能6
// 结点类
class Node {
public:
	char ch;        // 字符
	int freq;       // 字符出现频率
	Node* left;     // 左孩子
	Node* right;    // 右孩子

	Node() {}

	Node(char c, int f) {
		ch = c;
		freq = f;
		left = nullptr;
		right = nullptr;
	}

	~Node() {
		delete left;
		delete right;
	}
};

//-----------------------------------------------------------------------------------------------------------------------------



//-----------------------------------------------------------------------------------------------------------------------------
//函数区域

void menu();//打印选项菜单
void menuone();//打印次级选项菜单
void KeyEvent();//总体的选项事件
int readInfo();//使用者自主选择读入一段文本;
void readInfoHand();//读取一个Txt文本(但是目前只开发了英文和标点符号的)
// 建立哈夫曼树
Node* buildHuffmanTree(unordered_map<char, int>& freqMap);
// 哈夫曼编码哈希表
void buildHuffmanCode(Node* root, string code, unordered_map<char, string>& huffmanCode);
// 哈夫曼编码压缩
string compress(string text, unordered_map<char, string>& huffmanCode);
// 哈夫曼解码,返回原始文本
string decompress(string compressedText, Node* root);
void Hafuman();//哈夫曼编码压缩主体函数
void gotoxy(int x, int y);//光标定位 
void changeColors();//改变控制台颜色函数
void HafumanYasuoShuchu();//哈夫曼编码压缩文本输出
void HafumanYasuoNumberShuchu();//哈夫曼编码的数量排序
void HafumanYasuoBianmaShuchu();//哈夫曼编码的展示
int getCompressedLength(const string& text, const unordered_map<char, string>& huffmanCode);//统计压缩后的字符数位数
int readInfoBiao();//用于功能6,读取哈夫曼编码表
int readInfoWenben();//用于功能6,读取哈夫曼压缩后的文本
void Jiema();//功能6,解码的函数汇总
//----------------------------------------------------------------------------------------------------------------------------



int main()
{
	changeColors();

	while (1)
	{
		menu();
		KeyEvent();
		if (key == 27)break;
		system("pause");
		system("cls"); //清屏
	}
	system("cls"); //清屏
	return 0;
}

void KeyEvent()
{
	key = _getch();
	switch (key)
	{
	case 27:	system("cls"); cout << "------退出中------" << endl; system("pause");
c++利用哈夫曼编码实现文件的压缩加密和解压缩解密 c++利用哈夫曼编码实现文件的压缩加密和解压缩解密,哈夫曼树 阅读详情

相关推荐

基于哈夫曼编码对文件进行压缩和解压缩(详细讲解)

基于哈夫曼编码对文件进行压缩和解压缩(详细讲解) 本文对应c++代码实现链接 一、背景 利用特定的算法来压缩数据的工具,压缩后生成的文件称为压缩包。如果想使用其中的数据,就得用压缩软件对数据进行解压。利用压缩软件对文件中重复的数据进行压缩,可以减小文件中的字节总数,常用的压缩软件有rar、zip等。 二、编码介绍 2.1 等长编码 任何文件在计算中都是以字节为最小单位进行存储的,所以可以把任何文件看作是利用8位(一个字节)作为等长编码编码方式,编码而成的文件。往往这种编码方式并不是最优的编码方式。 例如:对

lizefeng1998的博客 2万+

Qt实现哈夫曼编码解压缩软件详解

诸位既然点开了本帖,相信对此问题已有初步了解,哈夫曼树的原理不再赘述,我们开门见山,直入主题。 一、概要设计 问题拆解:设计一个基于哈夫曼编码的解压缩软件,这个问题我认为可以分解为以下几个子问题: 读取传入文件,进行字符权重统计 将出现的字符放入哈夫曼树结点,构建哈夫曼树,获取哈夫曼编码 将编码相关信息写入压缩后的文件,再将传入文件的每个字符按照哈夫曼编码转换,每8个二进制位作为一个字节传入压缩后的文件 解压部分:将传入的已压缩文件进行文件流读取,获取编码信息进行还原 根据这几个子问题的思路顺序,我们逐

RealCoder的博客 9275

C++ 哈夫曼编码

1.哈夫曼编码的结点类: struct HuffmanNode { int weight; // 权重,出现的次数或者频率 char ch; // 存储符号 string code; // 存储该符号对应的编码 int leftChild, rightChild, parent; // 左、右孩子,父结点 }; 2.思路: (1)统计输入的字符串中不同字...

ChanJose的博客 2万+

C++实现哈夫曼编码/译码器(数据结构)

设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。 (1) 从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt); (2) 统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理); (3) 根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码; (4) 图形化输出哈夫曼树、哈...

Lei Gong's blog 9381

C++实现哈夫曼编码对文本的压缩与解压

首先了解一下什么是哈夫曼压缩: 哈夫曼树(HuffManTree)是用来压缩数据的一种数据结构,它适合压缩数据重复率较高的情况。 例如:文本A:123456789,这串文本重复率为0,因为每个字符都是唯一的,没有重复率而言; 文本B:111222334,这串文本重复率明显较A高,适合用哈夫曼树压缩。 如果我们需要来压缩下面的字符串: “beep boop beer!” 首先,我们先计算出每个字符出现的次数,我们得到下面这样一张表 : 然后,我把把这些东西放到Pri...

weixin_52663515的博客 2138

哈夫曼编码及文本文件的压缩解压(c++SourceCode)

哈夫曼编码是一种编码方式,是可变字长编码(VLC)的一种。以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据 压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的 编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出 现概率高

dooder_daodao的专栏 1万+

哈夫曼树、哈夫曼编码与译码实现(c语言)

源于一次实验课,要求实现哈夫曼树、哈夫曼编码与译码;我就直接贴实验要求和代码实现了。 注:因为当时时间有限,故其实该代码还有优化空间,且输出文件是0/1字符串文本(UTF-8)并不是ASCII码编码文件,计算压缩率除以8即可。 实验项目:哈夫曼编码与译码方法 哈夫曼编码是一种以哈夫曼树(最优二叉树,带权路径长度最小的二叉 树)为基础的基于统计学的变长编码方式。其基本思想是:将使用次数多的代 码转换...

Eric 1万+

(C++算法核心实现,MFC制作界面)哈夫曼编码算法制作压缩软件

前言 一个简单的压缩软件,利用哈夫曼思想,构造哈夫曼编码,实现对文件的二进制压缩,以及解压,再利用MFC制作可视化操作界面,美化软件又简化文件操作。(各个步骤有解释可看) 软件主页面先看看 哈夫曼树结构 构造哈夫曼树存储结构:w权重即每个字节出现频度,byte结点数据即每个字节的ASCII码,fa双亲结点下标,le左孩子下标,ri右孩子下标,从下往上开始构建哈夫曼树。 根据已构造完成的哈夫曼树,...

weixin_43853097的博客 3830

哈夫曼编码的一个实际应用(压缩与解压)

在课堂上,我们学习了哈夫曼编码的原理和实现方法,上实验课时也动手实现过,后来我们又追加介绍了哈夫曼编码的实际压缩和解压缩的实现方法,并且在课堂上也演示了,但当时我们却忽略了一个环节,那就是实际文件存储时,二进制是比特位,而存储的单位一般是字节,显示时又是按照十六进制的。现在给你一个由字典里的字符组成的原文,用哈夫曼方法把该原文压缩成十六进制码。 Input

GOTOTHEBAD 1万+

哈夫曼编码(C++实现)

哈夫曼树是用来创建哈夫曼编码的。哈夫曼编码是一种可以用于数据压缩的编码方式,哈夫曼编码的构造过程需要用到哈夫曼树。

Edison's 小宇宙 2万+

哈夫曼编码压缩实战:C++实现文件压缩与解压

HX−i1∑n​pxi​log2​pxi​HX−0.4∗log20.40.3∗log20.30.2∗log20.20.1∗log20.1))≈1.846bitschar传统ASCII编码需要8bits/char,理论最大压缩率=1.846/8≈23%

weixin_69882801的博客 1452

用哈夫曼编码实现文件解压缩

1.分析待压缩文件,获取文件中出现的字符,字符出现次数.将这些数据组织成字典,根据每个字符出现次数进行权值确定和更改,字符出现次数多的,权值大,编码就越短,压缩效果就会更好。找出出现次数最小的字符节点,和第二小的节点构造父节点,新构造的父节点覆盖出现次数最少节点,出现次数第二小的字符节点制空,不参与下次循环。码文件中各Ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。带参数的构造函数,用于初始化字符,字符出现的次数和字符在字符字典中的位置。

weixin_74137248的博客 1964

对文件进行哈夫曼编码压缩与译码的C++实现 以及压缩率计算 ——HIT杨朔

对英文文本文件进行哈夫曼编码译码的C++实现 以及压缩率计算哈夫曼编码压缩原理:由于每个字符在内存中都是以ASCII码进行存储,所以每个字符都占用了八个01位,利用哈夫曼树对每个字符进行01编码,根据字符在文章中出现的频率调整01串长度,出现频率高的字符在哈夫曼树中的权重大,编码后01串短,从而使得最终计算出的平均编码长度小于8,在本代码中平均编码长度约为4.72,压缩率约为59%,从而达到压缩文本

HITyangshuo的博客 4414

哈夫曼编码压缩和解压缩文件——C++实现

实现效果 压缩前 压缩后 经验证解压缩前与解压缩后文本一致,无出入 文件目录 binaryTreeNode.h linkedBinaryTree.h 源.cpp 代码如下 binaryTreeNode.h #ifndef binaryTreeNode_ #define binaryTreeNode_ #include<vector> #include<bitset&gt...

weixin_44984664的博客 4149

哈夫曼编码原理及实现

构建编码树的方法是将频率最低的两个符号合并为一个新节点,该节点的频率为两个节点频率之和。哈夫曼编码(Huffman Coding)是一种用于数据压缩的编码方法,它通过给出不同的数据符号分配不同长度的编码,使得出现频率高的符号具有较短的编码,而出现频率低的符号具有较长的编码,从而达到压缩数据的目的。然而,对于哈夫曼编码的最佳性能,符号的频率应该是根据数据集的统计特征进行调整的。由于频率高的符号具有较短的编码,而频率低的符号具有较长的编码,所以整个编码后的数据长度会相对减小。

qq_35803412的博客 5014

信息论:利用C++利用哈夫曼编码技术对文本进行压缩

本文要设计一款简单的压缩软件,具有简单的操作界面,对文本进行等长或变长压缩;针对这些要求,本文设计并开发了3个小的模块来实现相关功能。由于技术有限,未能将三个模块进行整合。其中变长压缩运用了Huffman编码,Huffman 编码是一种经典的变长压缩编码。根据大数据统计出的字母出现概率,Huffman 编码将各个字母按照不同码长进行编码,用短码表示出现概率高的字母,用长码表示出现概率低的字母,从而使得所有字母的平均码长降低,达到压缩的目的。

Windows+VSCode+Cline+MCP全流程配置指南

本文提供了一份详细的Windows+VSCode+Cline+MCP全流程配置指南,旨在帮助开发者打造高效的AI辅助编码工作站。文章从环境准备讲起,逐步指导安装VSCode、配置Cline插件、搭建Node.js环境,并重点详解如何通过MCP为Cline集成文件系统和GitHub等工具服务器,实现用自然语言操控开发环境,从而显著提升日常编码与文件管理效率。

weixin_28840143的博客 552

Materials studio中的简单聚合物的建立及盒子的弛豫

涉及模块 Amorphous Cell-construction Forcite-caculation Build Polymers-Homopolymer

快乐学术猿 3万+

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 398

[官方培训]19-物理模拟 Epic 肖月 笔记

物理引擎全局解算精度的设置,帧率越高,子步越多得到的模拟结果就越精确。引擎默认情况下是以变化的帧率运行的,但是对于Chaos物理引擎来说。一般子步越小,帧率越固定,效果就会更好更稳定一些。图示的分步选项就是依据下方的最长子步时长和最大步数对动态变化的帧率,进一步的做拆分来保证物理效果。对于影视项目建议都开启分步选项。红色框内有三个迭代次数的设置,这是Chaos基于位置的约束求解算法专用的一个设置,可以简单理解为迭代次数越高,当前帧一个子步内得到的结果就越精确。

Tcohneyn的博客 1545

【车辆仿真】从0开始建立dSPACE RT Simulink工程:输出模拟电平

0基础建议先看下前面的博文,补充基础知识。原来的博文太长太复杂,后续我会逐步梳理改进,去除操作层面的内容,仅关注知识层面,提升系列博文的系统性。【工程环境信息】:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):SCALEXIO RTPC板卡:DS2680。

winnizap的博客 2055

一个测试工程师走进一家酒吧……

一个测试工程师走进一家酒吧,要了一杯啤酒;一个测试工程师走进一家酒吧,要了一杯咖啡;一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;一个测试工程师走进一家酒吧,要了-1 杯啤酒;一个测试...

字节跳动技术团队官方博客 4886

Langchain与Milvus集成中的pymilvus.exceptions.MilvusException: channel not found错误解析

本文深入解析了在Langchain与Milvus集成时常见的pymilvus.exceptions.MilvusException: channel not found错误。该错误通常由客户端配置错误、网络问题、服务端状态异常或版本不兼容导致。文章提供了从基础连通性测试到高级网络排查的完整故障排除指南,并针对本地Docker、远程服务器及Kubernetes等典型部署场景给出了具体解决方案,帮助开发者快速定位并修复这一连接层问题。

weixin_29229989的博客 217

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 509

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 读取一个Txt文本参与哈夫曼编码压缩文本运算
下一篇: Java保留小数点后几位(包含四舍五入和非四舍五入)
「已注销」
博客等级 码龄7年 155粉丝 56原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值