赫夫曼编码(基于赫夫曼树的实现)
上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性)。
名词:定长编码,边长编码,前缀码(装B用的)
定长编码:像ASCII编码
变长编码:单个编码的长度不一致,可以根据整体出现频率来调节
前缀码:所谓的前缀码,就是没有任何码字是其他码字的前缀
赫夫曼编码是基于贪心算法实现的(我以后的文章中会提到)
出现的次数越多,越靠前。例如下图的最高点132为次数(权重),则是第一位。
对于此代码,不作为重点,如果你是考研党,需能手写代码,如果只是为了提高编程能力,了解具体的思路即可,到真正用到的时候在翻阅相关具体代码。了解整体思路后,可以掌握大局。
C/C++实现:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; #define N 10 // 带编码字符的个数,即树中叶结点的最大个数
#define M (2*N-1) // 树中总的结点数目 class HTNode{ // 树中结点的结构
public: unsigned int weight; unsigned int parent,lchild,rchild;
}; class HTCode{
public: char data; // 待编码的字符 int weight; // 字符的权值 char code[N]; // 字符的编码
}; void Init(HTCode hc[], int *n){
// 初始化,读入待编码字符的个数n,从键盘输入n个字符和n个权值 int i; printf("input n = "); scanf("%d",&(*n)); printf("\ninput %d character\n",*n); fflush(stdin); for(i=1; i<=*n; ++i) scanf("%c",&hc[i].data); printf("\ninput %d weight\n",*n); for(i=1; i<=*n; ++i) scanf("%d",&(hc[i].weight) ); fflush(stdin);
}// void Select(HTNode ht[], int k, int *s1, int *s2){
// ht[1...k]中选择parent为0,并且weight最小的两个结点,其序号由指针变量s1,s2指示 int i; //找到s1 *s1 = i; for(i=1; i<=k; ++i){if(ht[i].parent==0 && ht[i].weight<ht[*s1].weight) *s1 = i; } for(i=1; i<=k; ++i){if(ht[i].parent==0 && i!=*s1) break; } //找到s2 *s2 = i; for(i=1; i<=k; ++i){if(ht[i].parent==0 && i!=*s1 && ht[i].weight<ht[*s2].weight) *s2 = i;}
} void HuffmanCoding(HTNode ht[],HTCode hc[],int n){
// 构造Huffman树ht,并求出n个字符的编码 char cd[N];int i,j,m,c,f,s1,s2,start; m = 2*n-1;
//此for循环为建立森林 for(i=1; i<=m; ++i){if(i <= n) ht[i].weight = hc[i].weight; ht[i].parent = ht[i].lchild = ht[i].rchild = 0; }
//通过选取两个最小的值赋值给s1,s2。然后对ht数组进行操作,完成建立最优二叉树。
//其中ht[s1].parent是按照下标进行区分,不是存储的双亲的值,而是存储的双亲的位置。 for(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; } cd[n-1] = '\0'; for(i=1; i<=n; ++i){start = n-1; for(c=i,f=ht[i].parent; f; c=f,f=ht[f].parent){ if(ht[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; } strcpy(hc[i].code, &cd[start]); }
} int main()
{ int i,m,n,w[N+1]; HTNode ht[M+1]; HTCode hc[N+1]; Init(hc, &n); // 初始化 HuffmanCoding(ht,hc,n); // 构造Huffman树,并形成字符的编码 for(i=1; i<=n; ++i) printf("\n%c---%s",hc[i].data,hc[i].code); printf("\n"); return 0;
}
C语言学习经验:
- scanf(“%c”,地址);//所以以后做开发的时候,一定记住什么时候用地址,什么时候用地址对应的值。
赫夫曼编码(基于赫夫曼树的实现)相关推荐
- 赫夫曼树介绍、赫夫曼树的性质、赫夫曼编码、赫夫曼树与赫夫曼编码的应用
文章目录 赫夫曼树 1. 赫夫曼树介绍: 2. 赫夫曼树的创建过程: 3. 赫夫曼树的性质: 4. 赫夫曼编码: 5. 赫夫曼树与赫夫曼编码的c语言代码实现: 赫夫曼树 1. 赫夫曼树介绍: 赫夫 ...
- 树:赫夫曼树赫夫曼编码
1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...
- 赫夫曼树以及赫夫曼编码实现
介绍 赫夫曼树创建图解思路 一直找就找到最好的样子: 赫夫曼树创建代码实现 package 树;import java.util.ArrayList; import java.util.Collect ...
- 数据结构与算法(赫夫曼树,赫夫曼编码)
赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...
- 一文了解赫夫曼树的构建与赫夫曼编码
文章目录 一.赫夫曼树 基本介绍 赫夫曼树几个重要概念和举例说明 赫夫曼树创建步骤图解 代码构建赫夫曼树 二.赫夫曼编码 1基本介绍 通信领域中的信息的处理方式1-定长编码 通信领域中的信息的处理方式 ...
- 数据结构与算法——赫夫曼树基本实现
目录 一.赫夫曼树 1.1 基本介绍 1.2 赫夫曼树创建步骤图解 1.3 代码实现 二.赫夫曼编码 2.1 基本介绍 2.1.1 通讯领域 - 定长编码 - 举例说明 2.1.2 通讯领域 - ...
- 【数据结构】赫夫曼树与编码
赫夫曼树与赫夫曼编码 前言 赫夫曼树 存储结构 初始化树 构建树 赫夫曼编码 初始化编码 构建编码 前言 (概念) 路径:从一个节点到另一个节点的分支 路径长度:从一个节点到另一个节点的分支总数 节点 ...
- 数据结构(十五)— 树结构之赫夫曼树及其应用
现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...
- 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码
//严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...
最新文章
- 为什么要用这些框架来进行开发,直接new一个对象不香吗?
- 计算机学院心理节活动,计算机学院成功举办 “说出你的故事” 心理交流互助活动...
- Python的全局和局部变量
- VC6.0:“Setup was unable to create a DCOM user account“的解决方案
- Web前端技术分享:img标签下方出现空隙的问题解决方案
- ansible的系统模块8
- linux cmake变量,linux – CMake错误:此项目中使用了以下变量,但它们设置为NOTFOUND...
- python常量列表_Python中实现常量(Const)功能
- recv和send函数
- 浮点数比较大小的时候不能直接用等号
- Texlive source
- js中点击按钮时变色,松开后恢复原来的颜色
- 第三章:数组[5常见算法]--[6反转]
- ELK 收集 Tomcat 日志
- 使用axure9绘制三级导航
- Retrofit,RecyclerViewMVP模式
- 聊聊北京大部分前端从业者所面临的困境
- Effective GO
- HiveSQL小练习--求连续消费的天数
- ABAP 关于 delete adjacent duplicates from的小心得
热门文章
- 释放CPU,算力经济下DPU芯片的发展机遇
- Python 搭建车道智能检测系统
- 发布了!2020年AI人才发展报告,最高补助1000万!
- 帮AI体检看病一条龙服务,阿里发布“AI安全诊断大师”
- 疫情可视化,基于知识图谱的AI“战疫”平台如何做?
- 8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!
- 王贻芳院士:为什么中国要探究中微子实验?
- 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势
- 万万没想到! logger.info() 还能导致线上故障?
- 阿里三面让我现场改造Spring框架,明天带他去爬山!