武汉理工大学数据结构综合实验——二叉树与赫夫曼图片压缩
文章目录
- 实验目的
- 主要仪器设备及耗材
- 一、实验要求
- 二、分析与设计
- 1.数据结构的设计
- 2.核心算法设计
- 生成Huffman树的算法
- 生成Huffman编码的算法
- 压缩编码的算法
- 3.测试用例设计
- 4.测试效果
- 总结
实验目的
1. 掌握树的存储结构2. 掌握二叉树的三种遍历方法3. 掌握 Huffman 树、Huffman 编码等知识和应用4. 使用 C++、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。
主要仪器设备及耗材
1.安装了Windows 10操作系统的PC机1台
2.PC机系统上安装了Microsoft Visual Studio 2019开发环境
以下是本篇文章正文内容,下面案例可供参考
一、实验要求
针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每种字节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。
利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。
压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如 pic.bmp,压缩后 pic.bmp.huf。
二、分析与设计
依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流程为:
① 读取图片文件、统计权值
② 生成 Huffman 树
③ 生成 Huffman 编码
④ 压缩图片文件
⑤ 保存压缩的文件
1.数据结构的设计
代码如下(示例):
//定义存储Huffman树的结构体
typedef struct HTNode
{int weight;//权值int parent;//父亲节点int lchild;//左孩子int rchild;//右孩子
}HTNode, *HuffmanTree;typedef char** HuffmanCode;//定义哈夫曼编码类型//文件头
struct HEAD
{char type[4];//文件类型int length;//原文件长度int weight[256];//权值
};
2.核心算法设计
生成Huffman树的算法
代码如下(示例):
void CreateHuffmanTree(HuffmanTree &HT,int* a, int n)//构造哈夫曼树
{//初始化HT = new HTNode[2 * n ]; //动态申请2n个空间 ,0号未使用for (int i = 1; i <= 2 * n-1 ; i++) {//双亲 ,左右孩子置0HT[i].parent = HT[i].lchild = HT[i].rchild = 0;}for (int i = 1; i <= n; i++) {//初始化前n个的权值 HT[i].weight = a[i-1];}for (int i = n + 1; i <= 2 * n - 1; i++)HT[i].weight = 0;//选取与合并,删除与加入 for (int k = n+1; k <= 2 * n - 1; k++) {int s1, s2;Select(HT, k-1, s1, s2);//选取两个权值最小值的位置HT[s1].parent = k; HT[s2].parent = k; //修改父节点HT[k].lchild = s1; //更新左孩子权值 HT[k].rchild = s2; //更新右孩子权值 HT[k].weight = HT[s1].weight + HT[s2].weight; //更新自己的权值 }
}//选取两个权值最小值的位置
void Select(HuffmanTree& HT, int i, int& s1, int& s2) {int minValue = 0x7FFFFFFF;//找到最小的一个权值for (int j = 1; j <= i; j++) {if (HT[j].parent == 0 && HT[j].weight < minValue) {minValue =HT[j].weight;s1 = j;}}// cout << "最小权值:" << s1;minValue = 0x7FFFFFFF;//找到倒数第二小的权值for (int j = 1; j <= i; j++) {if (j != s1 && HT[j].parent == 0 && HT[j].weight < minValue) {minValue = HT[j].weight;s2 = j;}}// cout << "\t次之权值:" << s2 << endl;
}
生成Huffman编码的算法
代码如下(示例):
//生成Huffman编码
void HuffmanCoding(HuffmanCode& HC, HuffmanTree& HT)
{//无栈非递归遍历Huffman树,求Huffman编码char cd[256] = { '\0' }; //记录访问路径int cdlen = 0; //记录当前路径长度for (int i = 1; i < 512; i++) HT[i].weight = 0; //遍历Huffman树时用做节点的状态标志int p = 511; //根节点while (p != 0) {//向左if (HT[p].weight == 0) {HT[p].weight = 1;if (HT[p].lchild != 0) {p = HT[p].lchild;cd[cdlen++] = '0';}//登记叶子节点的字符的编码else if (HT[p].rchild == 0) {HC[p] = (char*)malloc((cdlen + 1) * sizeof(char));cd[cdlen] = '\0';strcpy(HC[p], cd);//复制编码}}//向右else if (HT[p].weight == 1) {HT[p].weight = 2;//右孩子为叶子节点if (HT[p].rchild != 0) {p = HT[p].rchild;cd[cdlen++] = '1';}}//退回父节点,编码长度减一else {HT[p].weight = 0;p = HT[p].parent;cdlen--;}}
}
压缩编码的算法
代码如下(示例):
//实现压缩编码
int Encode(const char* Filename, const HuffmanCode HC, char* Buffer, const int nSize) {FILE* in = fopen(Filename, "rb");//打开文件//开辟缓冲区Buffer = (char*)malloc(nSize * sizeof(char));if (!Buffer) {cerr << "开辟缓冲区失败" << endl;//输出错误信息return 0;}char cd[256] = { 0 };//工作区int pos = 0;//缓冲区指针int c;//扫描文件进行哈夫曼压缩,结果存入缓冲区while ((c = getc(in)) != EOF) {strcat(cd, HC[c+1]);//复制HC到cd工作区里//压缩编码while (strlen(cd) >= 8) {Buffer[pos++] = Str2byte(cd);//截取字符串左边的8个字符,编码成字节for (int i = 0; i < 256 - 8; i++)cd[i] = cd[i + 8];//字符串左移8字节}}if (strlen(cd) > 0)Buffer[pos++] = Str2byte(cd);fclose(in);//关闭文件return 1;//成功
}
3.测试用例设计
任意形成一个BMP图片文件,观察其压缩比;
在互联网上搜索下载任意格式的图片文件,例如JPG格式,观察其压缩比。
4.测试效果
总结
详情可参考以下链接
链接:冲冲冲~
提取码:bwbw
复制这段内容后打开百度网盘手机App,操作更方便哦
武汉理工大学数据结构综合实验——二叉树与赫夫曼图片压缩相关推荐
- [数据结构与算法综合实验]二叉树与哈夫曼图片压缩
文章目录 一.实验要求 二.效果展示 三.源码 3.1.Compress.cpp 3.2.Compress.h 3.3.global.h 3.4.Huffman.cpp 3.5.Huffman.h 3 ...
- 武汉理工大学数据结构综合实验——图与景区信息管理系统实践
文章目录 实验目的 主要仪器设备及耗材 一.实验要求 二.分析与设计 1.数据结构的设计 2.核心算法设计 改进DFS算法 搜索最短路径 Prim算法(构建最小生成树) 3.测试用例设计 4.测试结果 ...
- 武汉理工大学数据结构综合实验——连连看游戏综合实践
文章目录 实验目的 主要仪器设备及耗材 一.实验要求 二.分析与设计(非线性结构) 1.数据结构的设计 2.核心算法设计 一条直线消子 两条直线消子 三条直线消子 初始化游戏地图 搜寻路径 提示和重排 ...
- 【数据结构与算法实验】二叉树与哈夫曼图片压缩
使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩.图片文件名为"Pic.bmp",压缩后保存为"Pic.bmp.huf"文件. 程序截图: Mai ...
- 二叉树与哈夫曼图片压缩(c++)
开发一个控制台程序,使用Huffnan压缩算法对bmp格式图片文件进行压缩 项目结构 运行结果 Huffman.h #pragma once #include<iostream> usin ...
- 数据结构之赫夫曼文件压缩解压
一.文件压缩 具体要求:给你一个图片文件,要求对其进行无损压缩, 看看压缩效果如何. 思路:读取文件-> 得到赫夫曼编码表 -> 完成压缩 package com.ws.数据结构.树.赫夫 ...
- php 二叉树 与赫夫曼树
在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下. ...
- 由二叉树构造赫夫曼树
赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有 n个叶子节点的二叉树,每个叶子节点带权为wi,则其中 带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假 ...
- 简述最优二叉树(赫夫曼树)
什么是哈夫曼树: 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权 ...
最新文章
- html 载入中,用纯CSS实现加载中动画效果
- mybatis3中@SelectProvider的使用技巧
- php实例化类的方法,在PHP中实例化类实例的不同方法
- Python 获取 网卡 MAC 地址
- Pytorch基础(一) 初始tensor
- wpf之DragDrop研究
- Unity3D图像后处理特效——Crease
- matlab九节点网络仿真问题,三机九节点电力系统仿真matlab
- 三维匹配_为什么你的倾斜摄影三维建模模型效果差,都进来看看
- Kotlin 系列 之 Flow (一)
- 强强协同,共拓发展!英特尔与太一物联举办 AI 计算盒聚合服务研讨会
- Swiper的安装及使用
- 软件测试的生命周期测试流程
- 三角形的缩放动画,不会做的看过来!
- c语言专业自我评价,设计类专业简历自我评价
- Wireshark | 猿如意
- 原画师惊呆:这个爆火AI真把梦境画成现实了!下载APP人人可用
- A man who has iron bone
- python中 inplace 参数的理解
- Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理
热门文章
- 每月产量不均衡,怎样分摊费用更合理?
- nodejs crud
- 恒源云(GPUSHARE)_语音识别与语义处理领域之低资源机器翻译综述
- java毕业设计吾悦商城管理系统mybatis+源码+调试部署+系统+数据库+lw
- CPU是计算机的大脑英语,走进PC的大脑:CPU知识全面剖析
- Android - Warning:Not annotated parameter overrides @NonNull parameter
- bt云服务器地址,windows服务器使用BT搭建环境
- 弃百万年薪加入创业期阿里拿500元,他证明选择和努力同样重要
- 微信开放平台open认证_在Open Knowledge上传播开放数据的日常任务
- 【kafka可视化工具】kafka-eagle在windows环境的下载、安装、启动与访问