哈夫曼算法构造代码
哈夫曼编码主要用于数据压缩。
哈夫曼编码是一种可变长编码。该编码将出现频率高的字符,使用短编码;将出现频率低的字符,使用长编码。
变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。如:0、10就是非前缀编码,而0、01不是非前缀编码。
按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止。
对于5个字符A、B、C、D、E,频率分别用1、5、7、9、6表示,则构造树的过程如下:
上面过程对应的哈夫曼树为:
假设规定左边为0,右边为1,则变长编码为:
A1:010
B5:011
C7:10
D9:11
E6:00
#include<iostream>
#include<string.h>
usingnamespacestd;
structNode{
charc;
intvalue;
intpar;
chartag; //tag="0",表示左边;tag="1",表示右边
boolisUsed; //判断这个点是否已经用过
Node(){
par=-1;
isUsed=false;
}
};
intinput(Node*,int); //输入节点信息
intbuildedTree(Node*,int);//建哈夫曼树
intgetMin(Node*,int); //寻找未使用的,具有最小频率值的节点
intoutCoding(Node*,int); //输出哈夫曼编码
intmain()
{
intn;
cin>>n;
Node*nodes=newNode[2*n-1];
input(nodes,n);
buildedTree(nodes,n);
outCoding(nodes,n);
delete(nodes);
return0;
}
intinput(Node*nodes,intn){
for(inti=0;i<n;i++){
cin>>(nodes+i)->c;
cin>>(nodes+i)->value;
}
return0;
}
intbuildedTree(Node*nodes,intn){
intlast=2*n-1;
intt1,t2;
for(inti=n;i<last;i++){
t1=getMin(nodes,i);
t2=getMin(nodes,i);
(nodes+t1)->par=i;(nodes+t1)->tag="0";
(nodes+t2)->par=i;(nodes+t2)->tag="1";
(nodes+i)->value=(nodes+t1)->value+(nodes+t2)->value;
}
return0;
}
intgetMin(Node*nodes,intn){
intminValue=10000000;
intpos=0;
for(inti=0;i<n;i++)
{
if((nodes+i)->isUsed==false&&(nodes+i)->value<minValue){
minValue=(nodes+i)->value;
pos=i;
}
}
(nodes+pos)->isUsed=true;
returnpos;
}
intoutCoding(Node*nodes,intn){
chara[100];
intpos,k,j;
chartmp;
for(inti=0;i<n;i++){
k=0;
pos=i;
memset(a,"\0",sizeof(a));
while((nodes+pos)->par!=-1){
a[k++]=(nodes+pos)->tag;
pos=(nodes+pos)->par;
}
strrev(a); //翻转字符串
cout<<(nodes+i)->c<<""<<(nodes+i)->value<<":"<<a<<endl;
}
return0;
}
执行示例:
相关文章
- Google Research等机构提出新的AI算法以了解人脑网络中的电刺激效应
- 图像处理算法工程师——1必备技能总结——2面试题大全[通俗易懂]
- 操作系统实验四 银行家算法
- 操作系统–银行家算法c语言代码
- 产生随机数算法[通俗易懂]
- 攻克让你畏惧的算法,十行代码搞定快速排序
- Dijkstra(迪杰斯特拉算法)的实现-------------------------C,C++,Matlab实现
- 老生常谈React的diff算法原理-面试版
- 量子算法与实践——Grover算法
- 回溯法解决01背包问题算法_01背包问题伪代码
- LM算法代码_快速排序算法代码
- 数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病|附代码数据
- C/C++语言常用排序算法
- 【算法】哈希表 ( 两数之和 )
- ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测|附代码数据
- 算法-数组中的逆序对详解编程语言
- php数字转汉字代码(算法)
- JS实现随机数生成算法示例代码
- C语言对堆排序一个算法思路和实现代码