欢迎登录北京林业大学OJ系统
http://www.bjfuacm.com

262基于哈夫曼树的数据压缩算法

描述
输入一串字符串,根据给定的字符串中字符出现的频率建立相应哈夫曼树,构造哈夫曼编码表,在此基础上可以对待压缩文件进行压缩(即编码),同时可以对压缩后的二进制编码文件进行解压(即译码)。
输入
多组数据,每组数据一行,为一个字符串(只考虑26个小写字母即可)。当输入字符串为“0”时,输入结束。
输出
每组数据输出2n+4行(n为输入串中字符类别的个数)。第一行为统计出来的字符出现频率(只输出存在的字符,格式为:字符:频度),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第二行至第2n行为哈夫曼树的存储结构的终态(形如教材139页表5.2(b),一行当中的数据用空格分隔)。第2n+2行为每个字符的哈夫曼编码(只输出存在的字符,格式为:字符:编码),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第2n+3行为编码后的字符串,第2n+4行为解码后的字符串(与输入的字符串相同)。

以下代码粘贴于自

基于哈夫曼树的数据压缩算法

输入样例
aaaaaaabbbbbccdddd
aabccc
0
输出样例
a:7 b:5 c:2 d:4
1 7 7 0 0
2 5 6 0 0
3 2 5 0 0
4 4 5 0 0
5 6 6 3 4
6 11 7 2 5
7 18 0 1 6
a:0 b:10 c:110 d:111
00000001010101010110110111111111111
aaaaaaabbbbbccdddd
a:2 b:1 c:3
1 2 4 0 0
2 1 4 0 0
3 3 5 0 0
4 3 5 2 1
5 6 0 3 4
a:11 b:10 c:0
111110000
aabccc

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
struct Num
{char ch;int num;
}an[7000], temp;
void sort1(Num *bn)
{Num te;int i, j;for (j = 0; j<26; j++)for (i = 0; i < 25; i++){if (bn[i].num < bn[i + 1].num){te = bn[i];bn[i] = bn[i + 1];bn[i + 1] = te;}}
}
void sort2(Num *bn, int n)
{Num te;int i, j;for (j = 0; j<26; j++)for (i = 0; i < 25; i++){if (bn[i].ch > bn[i + 1].ch&&bn[i + 1].num > 0){te = bn[i];bn[i] = bn[i + 1];bn[i + 1] = te;}}
}
typedef struct
{int weight;int parent, lchild, rchild;int vis;char ch;char strc[60];int len;int num;
}HTNode, *HuffmanTree;
void Select(HuffmanTree &HT, int k, int &s1, int &s2)
{int i;HTNode h1, h2;int t1, t2;t1 = t2 = 0;h1 = HT[1];h1.weight = 999999;for (i = 1; i <= k; i++){if (HT[i].weight <= h1.weight &&HT[i].vis == 0){h1 = HT[i];t1 = i;}}h2 = HT[2];h2.weight = 999999;for (i = 1; i <= k; i++){if (HT[i].weight <= h2.weight&&t1 != i&&HT[i].vis == 0){h2 = HT[i];t2 = i;}}if (h1.weight == h2.weight&&HT[t1].num > HT[t2].num){int temp;temp = t1;t1 = t2;t2 = temp;}s1 = t1;s2 = t2;HT[s1].vis = 1;HT[s2].vis = 1;return;
}
void code(HuffmanTree &HT, int len, char str[], int n, char cc)
{int i;for (i = 0; i < len - 1; i++)HT[n].strc[i] = str[i];HT[n].strc[i] = cc;HT[n].strc[i + 1] = '\0';if (HT[n].lchild != 0)code(HT, len + 1, HT[n].strc, HT[n].lchild, '0');if (HT[n].rchild != 0)code(HT, len + 1, HT[n].strc, HT[n].rchild, '1');
}
void CreateHuffmanTree(HuffmanTree &HT, int n, char *str, int n1)
{int s1, s2;s1 = s2 = 0;if (n <= 1)return;int m = 2 * n - 1;HT = new HTNode[m + 1];for (int i = 1; i <= m; i++){HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; HT[i].vis = 0; HT[i].len = 0; HT[i].num = i; HT[i].weight = 0;}for (int i = 1; i <= n; i++){HT[i].weight = an[i - 1].num;HT[i].ch = an[i - 1].ch;}for (int i = n + 1; i <= m; i++){Select(HT, i - 1, s1, s2);HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}int len = HT[m].len;HT[m].strc[len] = '1';if (HT[m].lchild)code(HT, 1, "", HT[m].lchild, '0');if (HT[m].rchild)code(HT, 1, "", HT[m].rchild, '1');return;
}int main()
{HuffmanTree h;int n, n1;char str[700], str2[700];while (cin >> str){if (str[0] == '0'&&str[1] == '\0')break;n1 = 0;for (int i = 0; i < 27; i++){an[i].num = 0;an[i].ch = 'a' + i;}n = strlen(str);for (int i = 0; i < n; i++){an[str[i] - 'a'].num++;str2[i] = str[i];str2[i + 1] = '\0';}sort1(an);for (int i = 0; i < 26; i++){if (an[i].num != 0)n1++;}sort2(an, n1);CreateHuffmanTree(h, n1, str, n1);if (n1 == 1){h = new HTNode[3];h[1].weight = n; h[1].parent = h[1].lchild = h[1].rchild = 0;h[1].ch = str[0]; h[1].strc[0] = '0'; h[1].strc[1] = '\0';}int f = 0;for (int i = 0; i < 26; i++)if (an[i].num > 0){f++;cout << an[i].ch << ":" << an[i].num ;if (f == n1)cout << endl;elsecout << " ";}for (int i = 1; i <= 2 * n1 - 1; i++){cout << i << " " << h[i].weight << " " << h[i].parent << " " << h[i].lchild << " " << h[i].rchild << endl;}for (int i = 1; i < n1; i++)cout << h[i].ch << ":" << h[i].strc << " ";cout << h[n1].ch << ":" << h[n1].strc;cout << endl;for (int i = 0; i < n; i++){for (int j = 1; j <= n1; j++)if (h[j].ch == str[i])cout << h[j].strc;}cout << endl;cout << str << endl;for (int i = 1; i <= 2 * n1 - 1; i++){h[i].parent = 0; h[i].lchild = 0; h[i].rchild = 0; h[i].vis = 0; h[i].len = 0; h[i].num = i;}}return 0;
}

BJFU_数据结构习题_262基于哈夫曼树的数据压缩算法相关推荐

  1. 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构& ...

  2. 数据结构 基于哈夫曼树的数据压缩算法

    数据结构 基于哈夫曼树的数据压缩算法 实验目的 实验内容 实验提示 实验代码 实验小结 实验目的 1.掌握哈夫曼树的构造算法. 2.掌握哈夫曼编码的构造算法. 实验内容 问题描述 输入一串字符串,根据 ...

  3. 基于哈夫曼树的数据压缩算法

    计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 数据结构与算法 班 级 17计科2班 综合实验2 基于哈夫曼树的数据压缩算法 实验日期 2019.04.29 综合实验二 基于 ...

  4. 数据结构实验——基于哈夫曼树的数据压缩算法

    /* 注:输入为多行字符串,以"0"结尾:例:abc def 0 此程序无法执行由单个字符组成的字符串. */ #include<iostream> #include& ...

  5. 3001基于哈夫曼树的数据压缩算法(附思路及注释)

    写在最前:我的思路用到了stl的map,对组pair相关知识. 描述 输入一串字符串,根据给定的字符串中字符出现的频率建立相应哈夫曼树,构造哈夫曼编码表,在此基础上可以对待压缩文件进行压缩(即编码), ...

  6. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

  7. 基于哈夫曼树的英文文本数据压缩算法

    基于哈夫曼树的英文文本数据压缩算法 (1)问题描述    输入一串字符串,根据给定的字符串中字符出现的频率建立相应的哈夫曼树,构造哈夫曼编码表,在此基础上可以对压缩文件进行压缩(即编码),同时可以对压 ...

  8. 赫夫曼编码(基于赫夫曼树的实现)

    上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...

  9. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

最新文章

  1. 16S+功能预测也能发Sciences:尸体降解过程中的微生物组
  2. python为什么慢_python-为什么startswith比切片慢
  3. 控制台资费管理主菜单java_java毕业设计_springboot框架的高速公路收费管理系统...
  4. oracle变量名,Oracle中的替换变量,变量名,变量名
  5. 【Java】基础知识整理
  6. 用C++实现可重用的数学例程
  7. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!
  8. php后台登录显示ok,thinkphp的项目 后台登录问题,怪事
  9. Eclipse console 编码设置
  10. 【爱心2】JAVA表白代码——“LOVE“
  11. 【树莓派】搭建局域网内网页实时视频监控
  12. 计算机毕设(附源码)JAVA-SSM久宠宠物店管理系统
  13. WinRAR密码破解(精)
  14. 计算机数制转换操作方法,计算机数制转换新方法
  15. 【SQLSERVER 2000】由于数据移动,未能继续以 NOLOCK 方式扫描
  16. 激光雷达的应用及发展前景
  17. HX711测试【一个非常廉价且实用的模块】
  18. 京东2018校招研发笔试题记录
  19. 题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)
  20. ​​​windows上传ipa到开发者中心(app store)的方法​​

热门文章

  1. IDEA 自动导入包
  2. 用C++写个倒计时小程序
  3. 上班族每天适合吃香蕉、苹果、柿子、猕猴桃、木瓜
  4. Windows2008 r2 x64下安装FTP服务器File Zilla server报错:could not load tls libraries filezilla
  5. 【数据结构_选择题】(D22 0520)
  6. 【JS】制作注册页面
  7. flutter 链接 夜神
  8. 【Android】代码实现模拟屏幕点击和键盘按键事件
  9. SpringBoot-整合Beetlsql
  10. 契约锁特色场景汇总|组织常用业务文件电子签场景