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

简介: 哈夫曼编码实现文件的压缩和解压
程序示例精选
哈夫曼编码实现文件的压缩和解压
如需安装运行环境或远程调试,可点击
博主头像进入个人主页查看博主联系方式,由专业技术人员远程协助!

前言

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

运行结果

文章目录

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

三、在线协助

一、所需工具软件

1. VS2019, C++
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();
}

运行结果

三、在线协助:

如需安装运行环境或远程调试,可点击博主头像,进入个人主页查看博主联系方式,由专业技术人员远程协助!

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

博主个人主页:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
博主所有文章点这里:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
博主联系方式点这里:https://developer.aliyun.com/profile/expert/rfnzgp3sk3ahc
相关文章
|
前端开发 算法 API
直接在前端做 zip 压缩/解压
前段时间研究前端是如何解析 excel 表格的时候了解到 jszip 这个库,可以直接在前端对 zip 包进行压缩和解压缩,今天稍微水一篇。
Java实现gz压缩与解压缩
Java实现gz压缩与解压缩
2379 0
|
1月前
|
存储 C#
C#使用哈夫曼编码实现压缩与解压
C#使用哈夫曼编码实现压缩与解压
29 0
|
5月前
|
Linux Python Windows
Python实现压缩和解压缩
Python实现压缩和解压缩
29 0
|
5月前
1078 字符串压缩与解压 (20 分)
1078 字符串压缩与解压 (20 分)
|
Serverless 对象存储 弹性计算
函数计算对文件进行压缩和解压缩使用总结
前言 函数计算具有弹性伸缩的能力,可以给用户带来免运维和毫秒级扩容的计算能力。 但是它也存在一些限制, 比如一个执行环境最大内存只有3G, 本文旨在进行总结一些函数计算在文件压缩和解压缩的一些实践案例, 希望能给大家抛砖引玉,引出更好的实践案例。
2982 0