文章目录

  • 实验目的
  • 主要仪器设备及耗材
  • 一、实验要求
  • 二、分析与设计
    • 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,操作更方便哦

武汉理工大学数据结构综合实验——二叉树与赫夫曼图片压缩相关推荐

  1. [数据结构与算法综合实验]二叉树与哈夫曼图片压缩

    文章目录 一.实验要求 二.效果展示 三.源码 3.1.Compress.cpp 3.2.Compress.h 3.3.global.h 3.4.Huffman.cpp 3.5.Huffman.h 3 ...

  2. 武汉理工大学数据结构综合实验——图与景区信息管理系统实践

    文章目录 实验目的 主要仪器设备及耗材 一.实验要求 二.分析与设计 1.数据结构的设计 2.核心算法设计 改进DFS算法 搜索最短路径 Prim算法(构建最小生成树) 3.测试用例设计 4.测试结果 ...

  3. 武汉理工大学数据结构综合实验——连连看游戏综合实践

    文章目录 实验目的 主要仪器设备及耗材 一.实验要求 二.分析与设计(非线性结构) 1.数据结构的设计 2.核心算法设计 一条直线消子 两条直线消子 三条直线消子 初始化游戏地图 搜寻路径 提示和重排 ...

  4. 【数据结构与算法实验】二叉树与哈夫曼图片压缩

    使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩.图片文件名为"Pic.bmp",压缩后保存为"Pic.bmp.huf"文件. 程序截图: Mai ...

  5. 二叉树与哈夫曼图片压缩(c++)

    开发一个控制台程序,使用Huffnan压缩算法对bmp格式图片文件进行压缩 项目结构 运行结果 Huffman.h #pragma once #include<iostream> usin ...

  6. 数据结构之赫夫曼文件压缩解压

    一.文件压缩 具体要求:给你一个图片文件,要求对其进行无损压缩, 看看压缩效果如何. 思路:读取文件-> 得到赫夫曼编码表 -> 完成压缩 package com.ws.数据结构.树.赫夫 ...

  7. php 二叉树 与赫夫曼树

    在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下. ...

  8. 由二叉树构造赫夫曼树

    赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有 n个叶子节点的二叉树,每个叶子节点带权为wi,则其中 带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假 ...

  9. 简述最优二叉树(赫夫曼树)

    什么是哈夫曼树: 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权 ...

最新文章

  1. html 载入中,用纯CSS实现加载中动画效果
  2. mybatis3中@SelectProvider的使用技巧
  3. php实例化类的方法,在PHP中实例化类实例的不同方法
  4. Python 获取 网卡 MAC 地址
  5. Pytorch基础(一) 初始tensor
  6. wpf之DragDrop研究
  7. Unity3D图像后处理特效——Crease
  8. matlab九节点网络仿真问题,三机九节点电力系统仿真matlab
  9. 三维匹配_为什么你的倾斜摄影三维建模模型效果差,都进来看看
  10. Kotlin 系列 之 Flow (一)
  11. 强强协同,共拓发展!英特尔与太一物联举办 AI 计算盒聚合服务研讨会
  12. Swiper的安装及使用
  13. 软件测试的生命周期测试流程
  14. 三角形的缩放动画,不会做的看过来!
  15. c语言专业自我评价,设计类专业简历自我评价
  16. Wireshark | 猿如意
  17. 原画师惊呆:这个爆火AI真把梦境画成现实了!下载APP人人可用
  18. A man who has iron bone
  19. python中 inplace 参数的理解
  20. Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理

热门文章

  1. 每月产量不均衡,怎样分摊费用更合理?
  2. nodejs crud
  3. 恒源云(GPUSHARE)_语音识别与语义处理领域之低资源机器翻译综述
  4. java毕业设计吾悦商城管理系统mybatis+源码+调试部署+系统+数据库+lw
  5. CPU是计算机的大脑英语,走进PC的大脑:CPU知识全面剖析
  6. Android - Warning:Not annotated parameter overrides @NonNull parameter
  7. bt云服务器地址,windows服务器使用BT搭建环境
  8. 弃百万年薪加入创业期阿里拿500元,他证明选择和努力同样重要
  9. 微信开放平台open认证_在Open Knowledge上传播开放数据的日常任务
  10. 【kafka可视化工具】kafka-eagle在windows环境的下载、安装、启动与访问