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

程序示例精选
哈夫曼编码实现文件的压缩和解压
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《哈夫曼编码实现文件的压缩和解压》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果


文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. VS2019, Qt
       2. C++

二、使用步骤

代码如下(示例):

#include<iostream>
#include <fstream> 
#include<map>
#include<queue>
#include <string>
using namespace std;
// 二叉树结点
struct HuffmanNode {
	HuffmanNode* lChild = nullptr;   //左孩子,一定要初始化,否则就会出很麻烦的问题。
	HuffmanNode* rChild = nullptr;  //右孩子
	char Data = '#';    //存储的字符
	int Weight;   //构建结点的时候存储权重,即频率
	HuffmanNode(char Data, int Weight) {
		this->Data = Data;
		this->Weight = Weight;
	}
	HuffmanNode() {};
};
// 自定义HuffmanNode比较函数
struct HuffmanNodeCompareWeightGreater
{
	bool operator() (const HuffmanNode *a, const HuffmanNode *b)
	{
		return a->Weight > b->Weight;	// 小顶堆
	}
};

class HuffmanTree {
	HuffmanNode* root;
	map <char, string> HuffmanMap;  //存储了对应字符和编码的map,解压的时候用与对照还原。
	map <char, int> OriginMap; //用于构建哈夫曼树之前统计频率所用,存储的是字符和对应的频率

	//字符频率统计,并存入最初的(字符-编码)map中
	void GiveWeight(char str);
	//构建哈夫曼树,
	void CreateHuffmanTree();
	//文件读取,并统计字符和频率以此来构建OriginMap
	void ReadFile();
	//遍历哈夫曼树所得到的字符以及编码得到新的映射,以字符串s形式存储处理后的Huffman编码
	void DisplayHuffmanTree(HuffmanNode* Temp, string s);
	//Pre为先序遍历,用来检验生成的树是否正确
	void Pre(HuffmanNode* p);
public:
	HuffmanTree() {
		root = new HuffmanNode();
	}
	//文件压缩并写入,对应着源文件和HuffmanMap中的编码一个一个的输出到新的文件
	void ZIP();
	//文件解压,
	void UNZIP();

};

//构建哈夫曼树,
void HuffmanTree::CreateHuffmanTree() {
	//遍历原始的map并根据其键值对逐一构建结点
	priority_queue<HuffmanNode*, vector<HuffmanNode*>, HuffmanNodeCompareWeightGreater> HuffmanQueue;
	map<char, int>::iterator it = OriginMap.begin();
	while (it != OriginMap.end()) {
		//这个每循环一次就取出一组键和值
		char ch = it->first;
		int frequency = it->second;
		HuffmanNode *temp = new HuffmanNode(ch, frequency);  //构建结点,ch即为每个节点存储的字符


int main() {
	HuffmanTree hfTree;
	hfTree.ZIP();
	hfTree.UNZIP();
}

运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作

当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 哈夫曼编码是一种基于字符出现频率的编码方式,可以将出现频率高的字符用较短的编码表示,出现频率低的字符用较长的编码表示,从而实现文件压缩。在压缩文件时,首先需要统计文件中每个字符出现的频率,然后根据频率构建哈夫曼树,最后根据哈夫曼树生成每个字符的编码表,将文件中的每个字符替换为对应的编码,从而实现压缩。在解压文件时,需要根据编码表将编码还原为原始字符,从而实现解压哈夫曼编码思想实现文件压缩解压功能已经被广泛应用于各种文件压缩工具中。 ### 回答2: 哈夫曼编码(Huffman Coding)是一种基于字符出现频率的数据压缩算法。它的压缩过程是通过将出现频率高的字符用较少的字节表示来达到压缩效果的。 在使用哈夫曼编码实现文件压缩解压功能时,首先需要对原始文件进行处理,统计每个字符出现的次数,并且将这些字符和它们对应的出现频率构成一个字符频率表。然后,根据哈夫曼编码的算法规则,将字符频率表转换成一个哈夫曼树。 构造哈夫曼树的过程中,将出现频率较高的字符作为叶子节点,把它们与它们的出现频率一起加入到哈夫曼树中。接着,依次从字符频率表中取出出现频率最低的两个字符,构建成一颗子树,以此类推,直到构建出整棵哈夫曼树。 在通过哈夫曼树对文件进行压缩时,对于哈夫曼树中的每个字符,都对应一个唯一的编码。而这个编码是由这个字符在哈夫曼树中从根节点出发到达该字符叶子节点的路径上的编码确定的。由于哈夫曼树不同的结构导致其对应的编码也是不同的,所以对于不同的文件,其哈夫曼编码也是不同的。 因此,编码的长度也会因为字符出现频率的不同而有所变化。出现频率高的字符,对应的编码较短,而出现频率低的字符,对应的编码较长。在对文件进行压缩时,将编码后的二进制数据输出至一个输出文件中,而压缩后的文件大小则比原始文件大小要小,达到压缩的目的。 在对压缩文件进行解压时,需要先读取到压缩文件中所包含的哈夫曼表和编码后的二进制数据。通过哈夫曼表和编码后的二进制数据,就可以还原出原始文件的数据并写入到输出文件中。 总之,哈夫曼编码是一种十分高效的文件压缩算法,能够非常有效地对文件进行压缩,从而减小文件的存储空间占用,帮助人们更加方便的保存和传输文件,并且实现的过程也相对比较简单。 ### 回答3: 哈夫曼编码是一种通用的数据压缩方式,其核心思想是根据待压缩文件中不同字符的出现频率,将出现频率高的字符赋予较短的编码,出现频率较低的字符赋予较长的编码,以此达到压缩数据的目的。 在实现文件压缩功能时,我们可以先对待压缩文件进行扫描,获取每个字符的出现频率,并根据频率构建哈夫曼树。在哈夫曼树构建完成后,对于每个字符,可以通过从根节点到其所在叶子节点的路径上所有“0”或“1”的组合来表示该字符的哈夫曼编码。通过将所有字符的哈夫曼编码进行拼接,即可得到文件压缩后的二进制数据流。压缩后的二进制数据流长度越短,表示采用哈夫曼编码后达到的压缩效果越好。 在实现文件解压功能时,我们需要利用相同的哈夫曼树来进行解码。对于压缩后的二进制数据流,我们可以从哈夫曼树的根节点开始遍历,根据二进制数据流中的“0”或“1”逐步向左或向右移动,直到遇到叶子节点,就可以获取到对应的字符。重复这个过程,直到遍历完整个压缩后的二进制数据流,即可得到文件的原始数据。 总而言之,采用哈夫曼编码思想实现文件压缩解压功能可以有效缩小文件的大小,提高存储和传输效率。我们可以通过优化哈夫曼树的构建算法和应用多种压缩算法相结合来进一步提高压缩效率,从而更好地满足不同场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荷塘月色2

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

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

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

打赏作者

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

抵扣说明:

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

余额充值