数据结构与算法--哈夫曼树应用
第1关:统计报文中各个字符出现的次数
任务描述
本关任务: 给定一串文本,统计其中各个字符出现的次数;
测试说明
平台会对你编写的代码进行测试:
测试输入:` abcdeabcdeabcdabcdabcdabcbccc
预期输出: a 6 b 7 c 9 d 5 e 2
代码:
//第一关
//(2)统计message所指一串报文中的所有不同字符及其出现次数
Precord computeChar(char *message)
{//补充代码//补充代码int i;Precord rcd=(Precord)malloc(sizeof(struct record));//初始化rcdrcd->m=0;for (i=0;i<N;i++){rcd->data[i].ww=0; //初始化各字符出现的次数为0}//统计for (i=0;i<strlen(message);i++){for (int j=0;j<=rcd->m;j++){if (rcd->data[j].ww==0){rcd->data[j].ww++;rcd->data[j].ch=message[i];rcd->m++;break;}else if (rcd->data[j].ch==message[i]){rcd->data[j].ww++;break;}}}return rcd;
}
第2关:对第一关报文中的各个字符进行哈夫曼编码
任务描述
本关任务:以第一关计算得到的各个字符的出现次数作为权值,构建哈夫曼树,并对各个字符进行哈夫曼编码。输入一串字符,输出各个字符及其出现的次数,该字符在哈夫曼树中是作为左分支还是右分支、该字符的哈夫曼编码。
输入
abcdeabcdeabcdabcdabcdabcbccc
输出
字符: a 出现次数:6 左or右:0 哈夫曼编码:00
字符: b 出现次数:7 左or右:1 哈夫曼编码:01
字符: c 出现次数:9 左or右:1 哈夫曼编码:11
字符: d 出现次数:5 左or右:1 哈夫曼编码:101
字符: e 出现次数:2 左or右:0 哈夫曼编码:100
代码:
//第二关
//(3)初始化哈夫曼树PHtTree initHuffman(Precord r){//补充代码int i;int n=2*(r->m)-1;PHtTree ht = (PHtTree)malloc(sizeof(struct HtTree));ht -> htable = (struct HtNode*)malloc(sizeof(struct HtNode)*n);ht -> m = r -> m;for(i=0; i<n; i++){ht->htable[i].ww = ht->htable[i].parent = ht->htable[i].llink = ht->htable[i].rlink = -1;}for(i=0; i<r->m; i++){ht -> htable[i].ww = r->data[i].ww;}return ht;}// 第二关
//(4)构造哈夫曼树。 根据报文中出现的各字符及其出现次数,构造哈夫曼树
//约定:构造过程中每次选的根结点值最小的子树作为左子树,根结点值次小的子树作为右子树
void createHuffman(PHtTree ht,Precord r)
{//补充代码int min1, min2, s1, s2;int i, j;int n=r->m;for(i=0; i<n; i++){min1=min2 = 255;s1=s2= -1;for(j=0; j<n+i; j++){if(ht->htable[j].ww < min1 && ht->htable[j].parent == -1){min2 = min1; s2 = s1; min1 = ht->htable[j].ww; s1 = j;}else if(ht->htable[j].ww < min2 && ht->htable[j].parent == -1){min2 = ht->htable[j].ww; s2=j;}}if(n+i != 2*n-1){ht -> htable[s1].parent = n+i;ht -> htable[s2].parent = n+i;}ht -> htable[n+i].ww = min1+min2;ht -> htable[n+i].llink = s1;ht -> htable[n+i].rlink = s2;}ht -> root = 2*n-2;}// 第二关
//(5)编码
void coding(PHtTree ht,Precord r)
{//补充代码int i,j;int n=r->m;int p, q;char str[5];for(i=0; i<n; i++){p = i;q = 0;while(ht->htable[p].parent != -1){if(ht->htable[ht->htable[p].parent].llink == p){str[q] = '0';q++;}else{str[q] = '1';q++;}p = ht->htable[p].parent;}str[q] = '\0';if(ht->htable[ht->htable[i].parent].llink == i)r->data[i].branch_code = '0';elser->data[i].branch_code = '1';p=q-1;for(j=0; j<q; j++){r->data[i].codes[j]=str[p];p--;}}}
第3关:哈夫曼译码
任务描述
本关任务:对第二关的字符串所得到的二进制编码串进行译码,输出译码后的原文。
输入:
00011110110000011110110000011110100011110100011110100011101111111
输出:
abcdeabcdeabcdabcdabcdabcbccc
代码:
// 第三关
//(6)译码
void decoding(char *codes,char *codesToMessage,PHtTree ht,Precord r)
{//补充代码int i=0,j=0; int p=0;int n=r->m;while(codes[j] != '\0'){p=2*n-2;while(ht->htable[p].llink != -1 && ht->htable[p].rlink != -1){if(codes[j] == '0')p = ht -> htable[p].llink;elsep = ht -> htable[p].rlink;j++;}codesToMessage[i] = r->data[p].ch;i++;}codesToMessage[i] = '\0';}
数据结构与算法--哈夫曼树应用相关推荐
- 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码
一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60, B:45, C:13 D:69 E ...
- 数据结构与算法--哈夫曼树及其应用
一.哈夫曼树的基本概念 1) 路径: 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 2) 结点的路径长度: 两结点间路径上的分支数 3) 树的路径长度:从树根到每一个 ...
- 数据结构与算法——赫夫曼树基本实现
目录 一.赫夫曼树 1.1 基本介绍 1.2 赫夫曼树创建步骤图解 1.3 代码实现 二.赫夫曼编码 2.1 基本介绍 2.1.1 通讯领域 - 定长编码 - 举例说明 2.1.2 通讯领域 - ...
- 数据结构与算法(赫夫曼树,赫夫曼编码)
赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...
- 数据结构实验之——哈夫曼树的实现
数据结构实验之--哈夫曼树的实现 目录 说明 代码 测试用例 目录 说明 哈夫曼树的这个实验我是采用常用的左'0'右'1'来实现的,输入是用文本输入的,大家在用之前目录下要记得创建"HT.t ...
- 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...
- 数据结构实验——基于哈夫曼树的数据压缩算法
/* 注:输入为多行字符串,以"0"结尾:例:abc def 0 此程序无法执行由单个字符组成的字符串. */ #include<iostream> #include& ...
- 【数据结构Note5】-哈夫曼树
文章目录 哈夫曼树 1. 构造哈夫曼树 2. 哈夫曼树的性质 3. 哈夫曼编码 哈夫曼树 结点的权:有某种显示含义的数值(如:表示结点的重要性等) 结点的带权路径长度:从树的根到该结点的路径长度(经过 ...
- 【数据结构-N】哈夫曼树带权路径计算
那个闪闪发光的人 会在某一天的雨后,不经意地出现在你的迷茫路口. 目录: 哈夫曼树的构建 带权路径长度计算 >>构建 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树. 构建哈夫曼树的 ...
最新文章
- 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
- java.net.SocketException四大异常解决方案---转
- Python学习笔记6(列表生成式)
- VMware 7.1.4安装Mac.OS.X.Lion.操作系统 key:安装 系统
- c++学习书籍推荐《Advanced C++》下载
- Wordpress固定链接伪静态
- java 遗传算法_遗传算法的基本概念和实现(附 Java 实现案例)
- leetcode76. Minimum Window Substring
- 201507152326_《Javascript实现跨域有4种方法——介绍jsonp和html5方法》
- [C/C++] C++中new的语法规则
- 详解离线安装Python库
- 优雅的解决Springboot:BindingException: Invalid bound statement (not found):异常
- fantastic-matplotlib:案例集合:
- Linux+C 开发基础
- 信用评分模型中的滚动率分析
- 0 1随机数C语言程序,C语言产生随机数的方法
- DCDC电源SW波形负压以及轻载振荡问题
- 基于Arduino和AIDA64的lcd1602显示电脑状态
- 关于死锁你了解多少,通过“让APP随手机壳改变颜色,程序员和产品经理大家”这一事,了解下死锁可好?
- HTML学习笔记(实体+meta标签+块、行内元素+语义化标签+布局标签)