哈夫曼树实现文件的压缩与解压缩

2023-11-03

利用哈夫曼树实现文件的压缩与解压缩
压缩:
1、统计出文件中相同字符出现的次数
2、获取哈夫曼编码
次数作为权值构建哈夫曼树
3、重新编码,写回压缩文件
保存头文件:
源文件后缀
编码信息的行数
每个字符的权
保存编码

解压缩:
1、获取原文件后缀
2、获取每个字符出现的次数,即权值
3、利用之前后的的权值,还原哈夫曼树
4、找到对应的叶子节点,将信息保存到解压文件中
在写压缩文件之前,首先需要实现堆和哈夫曼树
源代码戳这里
(https://coding.net/u/g33_N/p/fileCompress/git)

#define _CRT_SECURE_NO_DEPRECATE
#include"HuffManTree.h"
#include<assert.h>
struct FileInfo
{
    FileInfo()
    :_count(0)
    {}
    unsigned char _ch;//当前字符
    size_t _count;//当前字符出现的次数
    std::string _strCode;//当前字符的哈夫曼编码
    //重载+
    FileInfo operator+(const FileInfo& fileInfo)
    {
        FileInfo ret(*this);
        ret._count += fileInfo._count;
        return ret;
    }
    //重载<
    bool operator<(const FileInfo& fileInfo)const
    {
        return _count<fileInfo._count;
    }
    //重载!=
    bool operator != (const FileInfo& fileInfo)const
    {
        return _count != fileInfo._count;
    }
};
class CompressFile
{
public:
    CompressFile()
    {
        for (size_t idx = 0; idx < 256; ++idx)
        {
            _fileInfo[idx]._ch = idx;
            _fileInfo[idx]._count = 0;//每一个字符出现的次数初始化为0
        }
    }
    void FileCount(const std::string& strFileName)
    {
        //统计字符出现的次数
        FILE* fOut = fopen(strFileName.c_str(), "r");//打开一个文件
        assert(fOut);
        unsigned char rBuf[1024];//存取读到的文件内容

        while (1)
        {
            size_t rSize = fread(rBuf, 1, 1024, fOut);//返回从文件中读到的字节数

            if (rSize == 0)
                break;
            for (size_t idx = 0; idx < rSize; ++idx)
            {
                _fileInfo[rBuf[idx]]._count++;//统计每个字符出现的次数
            }
        }
    }
    //获取编码信息
    void GetHuffManCode()
    {

        // 创建HuffManTree
        HuffmanTree<FileInfo> ht(_fileInfo, sizeof(_fileInfo) / sizeof(_fileInfo[0]), FileInfo());
        _GetHuffManCode(ht.GetRoot());//获取哈夫曼编码


    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈夫曼树实现文件的压缩与解压缩 的相关文章

  • 初识哈夫曼编码

    1 什么是哈夫曼编码 1 什么是编码 编码就是把一些信息比如文字文件 视频文件转成0101的一堆数字存储起来 这些数字就是编码 它们需要满足数字与字符的一一对应关系 当然还必须满足可以由这一堆数字转回到文件信息 这样的编码才是有意义的 2
  • 算法题-简单系列-07-判断一个链表是否为回文结构

    文章目录 1 题目 1 1 使用list集合判断 1 题目 给定一个链表 请判断该链表是否为回文结构 回文是指该字符串正序逆序完全一致 1 1 使用list集合判断 因为需要判断是否为回文结构 所以要比较头尾的数据 而链表无法随机查询数据
  • 算法题-简单系列-03-判断链表中是否有环

    文章目录 1 题目 1 1 思路1 双指针 1 2 思路2 哈希表 1 题目 判断给定的链表中是否有环 如果有环则返回true 否则返回false 1 1 思路1 双指针 我们使用两个指针 fast 与 slow 它们起始都位于链表的头部
  • 算法题-简单系列-05-两个链表的第一个公共结点

    文章目录 1 题目 1 1 思路1 循环遍历 1 题目 输入两个无环的单向链表 找出它们的第一个公共结点 如果没有公共节点则返回空 1 1 思路1 循环遍历 使用两个指针N1 N2 一个从链表1的头节点开始遍历 我们记为N1 一个从链表2的
  • 算法题-简单系列-01-链表反转

    文章目录 1 题目 1 1 使用栈解决 1 2 反转链表 1 题目 给定一个单链表的头结点pHead 该头节点是有值的 比如在下图 它的val是1 长度为n 反转该链表后 返回新链表的表头 如当输入链表 1 2 3 时 经反转后 原链表变为
  • 基于Java的数据结构精品课程教学网站

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 本基于Java的数据结构精品课程教学网站是根据当前教学大环境相关的内容实际情况开发的 在系统语言选择上我们使
  • E (1052) : DS树--带权路径和

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 计算一棵二叉树的带权路径总和 即求赫夫曼树的带权路径和 已知一棵二叉树的叶子权值 该二叉树的带权路径和APL等于叶子权值乘以根节点到叶子的分支数 然后求
  • C语言,求取数组的序亏:已知一个整数数组,求出个数组中每个元素在整个 数组的排序。

    要求获取整数数组中每个元素的排序 可以使用以下方法 1 定义一个结构体数组 其中每个结构体包含数组元素的值和索引 2 遍历整数数组 将每个元素与其索引一起存储到结构体数组中 3 对结构体数组进行排序 按照元素的值进行升序排序 4 遍历排序后
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 【华为OD】给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数 的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这 两个数以及它们和的绝对值

    题目描述 给定一个整数数组nums 请你在该数组中找出两个数 使得这两个数 的和的绝对值abs nums x nums y 为最小值并按从小到大返回这 两个数以及它们和的绝对值 每种输入只会对应一个答案 数组中同一 个元素不能使用两遍 输入
  • 回溯算法第零篇【递归、搜索与回溯】【回溯算法入门必看】

    本篇文章的目的 1 给小伙伴们对回溯算法中的名词进行解释 2 消除递归的恐惧 回溯是递归的一个分支 给小伙伴们一个建议 整篇文章都要看完 一字不漏 全是干货 注意 分析回溯的思想之前 我们得知道一个关系 递归包含搜索 搜索包含回溯 所以我们
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas
  • LeetCode 1901. 寻找峰值 II

    一 题目 1 题目描述 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子 上 下 左 右 的元素 给你一个 从 0 开始编号 的 m x n 矩阵 mat 其中任意两个相邻格子的值都 不相同 找出 任意一个 峰值 mat i j
  • Leetcode 55 跳跃游戏

    题意理解 非负整数数组 nums 最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 需要跳到nums最后一个元素即为成功 目标 是否能够跳到最后一个元素 解题思路 使用贪心算法来解题 需要理解局部解和最优解的关系
  • 冒泡排序/选择排序/插入排序/快速排序/归并排序/桶排序/堆排序/希尔排序/计数排序/基数排序/二分查找/广度优先搜索/深度优先搜索

    排序算法 冒泡排序 Bubble Sort 通过重复地比较相邻的元素并交换它们 使得最大 或最小 的元素逐渐移动到列表的一端 从而实现排序 选择排序 Selection Sort 在未排序的部分中 选择最小 或最大 的元素 并将其放置在已排
  • 206.翻转链表

    翻转链表 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems re
  • 顺序表和链表基础

    定义动态的顺序表 typedef int SLDataType typedef struct Seqlist SLDataType array size t size size t capacity Seqlist 在顺序表中插入数据 bo
  • 高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

    文章目录 零 前言 一 加法 高精度加法步骤 P1601 A B 二 减法 高精度减法步骤

随机推荐

  • css实现:after中使用图片

    先看一下效果 下面是代码实现 xin position relative font size 20rpx color 15bf5d border 1rpx dashed ccc padding top 20rpx xin after con
  • pg常用插件

    pg软件包自带插件 前言 pg的插件是基于库的 pg的数据字典介绍 1 pg stat statements插件 Pg stat statements 是一个扩展 而不是核心数据库的一部分 它是一个contrib 扩展 随 postgres
  • 推荐一个冷门又逆天的副业(Python兼职可月入15k+)

    最近在论坛上看到一个测试 特扎心 以下三种情况 哪个让你最绝望 发薪日开心三分钟 各种家庭花销和贷款过一遍立马所剩无几 被领导骂到哭 因为没钱不敢裸辞 公司业绩不好 自己更是活成了一个小透明 薪资拿的少 还要随时担心被新人优化 说实话 我真
  • DirectX11 简介+环境配置

    文章目录 前言 获取SDK 安装 项目环境配置 创建项目 链接库 方法一 方法二 前言 DX11是Win7的产物 它是09年发布的 可谓是非常古老 那么为什么我们还要学习呢 这是为了给下一步的DX12做准备 如果你是Win10用户 且安装了
  • JAVA代码编写哈夫曼编码实现数据和文件的压缩和解压算法

    压缩算法思路 1 将待压缩的字符串变成字节数组 byte contentBytes 2 将字节数组每个字符出现的次数统计出来变为Node类 value为字符对应的Ascci码 weight为字符出现的次数也是哈夫曼树的权值 存入List集合
  • Kibana导出csv数据

    适用版本 ElasticSearch 6 8 0 Kibana 6 8 0 导出CSV文件配置 kibana配置文件 添加以下配置 xpack reporting csv maxSizeBytes 209715200 csv文件大小 默认为
  • SQL注入-盲注(布尔盲注与时间盲注)

    目录 一 什么是盲注 二 盲注的分类 三 利用盲注的前提条件 四 盲注的优缺点 五 基于布尔类型的盲注 1 什么情况下使用布尔类型的盲注 2 使用布尔类型盲注的操作步骤 3 布尔类型盲注的操作过程 以获取当前数据库为例 4 使用其他函数进行
  • iview—Table表格render 渲染

    1 序号 2 if判断 a标签 3 if判断 Input输入 4 renderHeader自定义列头的点击事件 render的Input点击事件 nativeOn click 5 正常列 6 按钮Button 7 复选框Checkbox 8
  • VSCode 远程开发:WLS 2 + ZeroTier 内网穿透

    前置条件 两台 Win 10 主机 其中一台 记为本地机 远程访问另一台主机 记为远程机 的 WSL 本地机安装好 VSCode 两台主机不在一个局域网内 且均无公网 IP 后续需要在两台主机上配置内网穿透 如果两台主机可相互 ping 通
  • Java 数据库编程 ResultSet 的 使用方法

    结果集 ResultSet 是数据中查询结果返回的一种对象 可以说结果集是一个存储查询结果的对象 但是结果集并不仅仅具有存储的功能 他同时还具有操纵数据的功能 可能完成对数据的更新等 结果集读取数据的方法主要是getXXX 他的参数可以使整
  • C++ string替换指定字符

    string自带replace 方法并没有实现这一功能 需要借助
  • git commit时权限被否定问题解决

    今天在提交博客时 git commit m 时出现了一些问题 问题如下 could not open git COMMIT EDITMSG Permission denied 意思大概就是无法打开 git COMMIT EDITMSG 权限
  • Java8 HashMap底层原理

    一 树集结构 1 1二叉查找树 二叉查找树 BST 具备什么特性呢 1 左子树上所有结点的值均小于或等于它的根结点的值 2 右子树上所有结点的值均大于或等于它的根结点的值 3 左 右子树也分别为二叉排序树 查找效率 二叉查找树查找的最大次数
  • Macbook配置工作环境

    Xcode 在App Store中搜索Xcode 下载安装 安装包大概6G 无需配置 直接App Store中安装即可 速度取决于网速 iterm2 mac下较好用的终端 下载地址 使用和配置文档参照 https iterm2 com in
  • Docker+Linux_Centos(内核:3.10.0-957.1.3.el7.x86_64)安装

    前言声明 如果您有更好的技术与作者分享 或者商业合作 请访问作者个人网站 http www esqabc com view message html 留言给作者 如果该案例触犯您的专利 请在这里 http www esqabc com vi
  • DBSCAN算法研究(2)--matlab代码实现

    DBSCAN聚类算法三部分 1 DBSCAN原理 流程 参数设置 优缺点以及算法 http blog csdn net zhouxianen1987 article details 68945844 2 matlab代码实现 blog ht
  • Python、Java的一些区别

    共同点 二者都是面向对象的编程语言 二者都是解释型语言 说明 解释型语言释义 程序不需要编译 而是在运行时一句一句翻译成机器语言 每运行一次都要翻译一次 所以效率相比较低 不同点 Python是弱类型语言 而Java是强类型语言 说明 强类
  • Vue 父组件中触发子组件的方法

    Vue 父组件中触发子组件的方法 使用场景 在父组件点击子组件时 触发子组件的初始化方法 方式一 子组件中使用 ref 属性
  • arch linux windows,使用ArchWSL在微软Windows WSL上运行Arch Linux系统

    本文教您在微软Windows WSL上运行Arch Linux系统的方法 ArchWSL使ArchLinux作为WSL实例 支持多次安装 本文操作步骤为 安装用于Linux的Windows子系统 前往GitHub下载ArchWSL 解压缩下
  • 哈夫曼树实现文件的压缩与解压缩

    利用哈夫曼树实现文件的压缩与解压缩 压缩 1 统计出文件中相同字符出现的次数 2 获取哈夫曼编码 次数作为权值构建哈夫曼树 3 重新编码 写回压缩文件 保存头文件 源文件后缀 编码信息的行数 每个字符的权 保存编码 解压缩 1 获取原文件后