哈夫曼树制作压缩软件

太爱bandzip了,在这里推荐这款压缩软件(我的是低仿
以下为自己软件图片

要求:

(1)压缩对象为外存任意格式任意位置的文件。
(2)运行时,压缩原文件的规模应不小于5K。运行后,外存上保留压缩后的文件。
(3)提供解压文件与原文件的相同性对比功能。
(4)建议,形成带交互界面功能的系统。
(5)其它要求同课后作业-01。提交时间待定。

一 :哈夫曼树是什么

哈夫曼树也称为最优二叉树,是加权路径长度最短的二叉树。

(a)树 WPL = 51 + 152 + 403 + 304 + 10*4 = 315

(b)树WPL = 53 + 153 + 402 + 302 + 10*2 = 220

通过比较发现,二叉树a的WPL值大于二叉树b,二叉树b其实就是一棵哈夫曼树。

二:哈夫曼树的构造

算法原理来自于贪心,
从有序的节点中
不断合并最小的二个节点再加入其中

三:哈夫曼编码

假若我们规定给每个结点的左路标记’0’,右路标记’1’,那么我们就可以用0、1来表示每个字母。以第一幅图中的二叉树b为例


四:文件压缩

(哈夫曼的介绍图片例子来自于csdn:Y-ANG,链接:https://blog.csdn.net/qq_33951180/article/details/53229240)

分界线---------------------------------------------------------------------分界线

正式开始

(默认已经安装了qt,没有见我qt计算器的分栏)

一 :了解以下知识(详情可见分栏)

如果我记得补上

1.qt的基础知识(详情见分栏qt的calculator)

2.文件流的读入和输出

     FILE *tem;strcpy(first_name,s.toLocal8Bit().data());tem=fopen(first_name,"rb");fclose(tem);

说明: 1. 使用"r"时,如果文件不存在,则出错。
2. 使用"w"时,如果没有文件,则创建一个新文件。
3. 使用"a"时,如果希望向文件尾添加数据,则该文件必须存在,否则出错。
4. “r+”,“w+”,"a+"都是可以输入和输出数据,但必须遵守上述3点

3.缓冲区

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

4.字节的概念

64位编辑器

所以如果把文件作为二进制读入,然后用char储存,每个char字符就一个字节
8个二进制(这个很重要)

5.压缩和解压的概念

压缩相当于加密,解压相当于解密(其中改变了大小)

二 :代码部分

class类

class tree//haffman tree
{public :int times;//hezchar data;//dataint code;//字符int code_len;//字符长度tree *left_tree,*right_tree;tree(){times=code=code_len=0;data=NULL;left_tree=right_tree=0;}~tree(){if(left_tree)delete left_tree;if(right_tree)delete right_tree;}void preoeder(int,int);//先序遍历,生成haffman编码
};class haffman
{private:char first_name[100];//被压缩的名字(用来存路径)char final_name[100];//char code_name[100];//tree *bas[551];//基础字符编码树 tree *haff_root;//根节点int bas_len;//基础字符树个数char *buffer,*r;//缓冲区,读入文件内容int lenth;//读入内容长度int max_bu,bu;//最大缓冲区段基值,偏移量QString formulate;public :double origin_size,final_size;haffman(){haff_root=NULL;buffer = new char [10*1024*1024];//1m=1024kb 1kb=1024b;r= new char [10*1021*1024];memset(bas,0,sizeof(bas));}~haffman(){delete buffer;delete r;delete haff_root;}void read(QString s);void count();//计算字符出现频率void new_sort(tree *a[],int,int);//快排void make_haffman();//生成haffman树void wbit(int);//向缓冲区写入一个字节void zip();void write(QString);//写入文件缓冲区中的内容void savecode();//保存haffman编码和缓冲区大小,供解压用void readbuffer(QString);//读入压缩文件内容到缓冲区void readcode();//读取haffman编码和缓冲区大小,供解压用void unzip(QString);
};

具体的函数实现有注释 但值得一提的是
缓冲区的数据可以写入被压缩的文件(这样就只会生成一个文件),也就是我们常用的压缩软件
本文的将其独立出来为.code为了真实的计算压缩之后和压缩之前的之比
(作业要求QAQ)

当然如果你有兴趣可以自己合并

代码放入github里面(现在放在码云了,国内好上去)

码云主页

ui界面

又到了拼乐高环节

详情参照qt的calculator

附录:因为最近有些朋友问了有些问题,我觉得还是很有必要再讲下一些需要注意的地方

1.读入为什么用char(因为它nb ),因为他可以储存许多奇奇怪怪的东西,例如他可以存数字和英文等等
2.建立树的过程 贪心思想,每次排序再选点然后建立
3.压缩 把每个原来的字符对应的二进制丢上去
例如 “aabb” “01011010”
这个时候,你打开压缩文件,肯定是一堆乱码(可能欧皇不是吧hhhhh)
因为假设你char八个二进制,电脑不一定有01011010对应的字符

最重要的一点 我有那么可怕吗

承包了我这个礼拜的笑点,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

哈夫曼树制作压缩软件 【此后无良辰】相关推荐

  1. 哈夫曼树实现压缩文件

    哈夫曼树实现文件的压缩 #include <stdio.h> #include <stdlib.h> #include <string.h>//以字节形式读入目标文 ...

  2. 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆

    一. 实验目的 理解和掌握CPU中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用Verilog和ModelSim进行设计和仿真. 二. 实验内容 使用Veril ...

  3. 合肥工业大学oj 算法实训(1)【此后无良辰】

    先暂时写必做30道题 只放思路和核心部分 (写的繁琐但易理解) 觉得有用的看官点个赞可好? (citrl + F 查找功能) 1.合法栈输出1060 记住数据输入是以EOF结束输入 基本思路 :回溯暴 ...

  4. 高级数据结构之赫夫曼树

    思考两个问题 电报发送:二战的时候大家都知道那时候普遍会应用电报,如果让你来设计一个电报的发送编码你该如何设计呢? 电报加密后越短越好,发送快. 破解难 解码容易 换加密树也要快 可逆的 压缩算法:给 ...

  5. 最优二叉树(赫夫曼树)

    赫夫曼树的介绍(写的不好地方大佬请指教) 最优二叉树又称哈夫曼树,是带权路径最短的二叉树.根据节点的个数,权值的不同,最优二叉树的形状也不同. 图 6-34 是 3 棵最优二叉树的例子,它们共同的特点 ...

  6. 用赫夫曼树进行文件的压缩

    思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStat ...

  7. 【数据结构和算法笔记】哈夫曼树的概念,构造和应用(利用哈夫曼编码压缩文本)

    目录 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码: 应用(压缩文本) 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码:  哈夫曼编码是前缀编码 哈夫曼树的性质 哈夫曼树的任意非叶结点的 ...

  8. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

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

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

最新文章

  1. 基于TensorFlow理解三大降维技术:PCA、t-SNE 和自编码器
  2. JQuery图片加载显示loading和加载失败默认图片
  3. 分布式事务最终一致看这篇“大白话”的实践
  4. 编写下载服务器。 第六部分:描述您发送的内容(内容类型等)
  5. 陆奇最新分享:数字化进程加速,创新者如何把握机会?
  6. Python装饰器详解,详细介绍它的应用场景
  7. Gentoo Linux 学习笔记1
  8. AngularJS创建应用- HTML5 移动框架
  9. 扇贝有道180923每日一句
  10. ADB常用命令(adb常用命令)
  11. 移动端vue调用照相机及相册
  12. 手动进行释放内存的API
  13. 搜狗搜索事业部总经理:从识图搜索谈未来大势
  14. ToF技术的应用及产业链简述----​ToF技术系列(一)
  15. 羊皮卷的故事-第一章
  16. 2022年深圳市国家高新技术企业认定条件、时间、流程
  17. [原创]FineUI秘密花园(六) — 表单控件
  18. Webix AngularJS
  19. Juniper 防火墙的MIP/VIP/DIP
  20. python中from是什么意思_Python中import和from的一些事。。。

热门文章

  1. nodejs+vue 在线零食店铺
  2. 输入输出式IP67防护profinet总线通讯I/O模块分线盒
  3. 华为内部一篇关于大数据的好文
  4. 数学日记-最小二乘法本质
  5. 对mac系统的初步认识
  6. sort() 对数值数组进行升序排序
  7. 通过 WMIC 获取杀软信息
  8. Android Studio Error: Google Play requires that apps target API level 30 or higher.
  9. 论文查重的标准是怎么样的?
  10. 免费商务风企业简介公司介绍PPT模板