霍夫曼编码及解码算法 霍夫曼编码 贪心算法

Code:

#include<iostream>
#include<string>
using namespace std;
typedef struct{
int weight;
int parent,lchild,rchild;
}HFNode;
void Select(HFNode *HT,int n,int &s1,int&s2){//在前n个数组中,选择parent为-1且weight最小的两个结点
int temp=100;
for(int i=0;i<n;i++)
if(temp>HT[i].weight&&HT[i].parent==-1){
s1=i;
temp=HT[i].weight;
}
temp=100;
for(int i=0;i<n;i++)
if(i!=s1&&temp>HT[i].weight&&HT[i].parent==-1){
s2=i;
temp=HT[i].weight;
}
}
void HuffmanCode(HFNode *&HT,int *w,intn){ //霍夫曼编码
int m=2*n-1,i,s1,s2;
HT=(HFNode *)malloc(m*sizeof(HFNode));
for(i=0;i<n;i++){//初始化前n个霍夫曼结点
HT[i].weight=w[i];
HT[i].parent=-1;
HT[i].lchild=-1;
HT[i].rchild=-1;
}
for(i;i<m;i++){//初始化后n-1个霍夫曼结点
HT[i].weight=0;
HT[i].parent=-1;
HT[i].lchild=-1;
HT[i].rchild=-1;
}
for(i=n;i<m;i++){//建立霍夫曼树
Select(HT,i,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;
}
for(intj=0;j<n;j++){//从叶子结点到根逆向求每个根节点的霍夫曼编码
char *cd=(char*)malloc(n*sizeof(n));
int k=0,c=j;
while(HT[c].parent!=-1){
if(HT[HT[c].parent].lchild==c)cd[k]='0';
if(HT[HT[c].parent].rchild==c)cd[k]='1';
k++;
c=HT[c].parent;
}
cout<<"第"<<j+1<<"个元素的霍夫曼编码为:";
for(intl=k-1;l>=0;l--)
cout<<cd[l];
cout<<endl;
free(cd);
}
}
void HuffmanEncode(HFNode *HT,int n,string s){//霍夫曼解码
int m=2*n-2;
for(inti=0;i<s.length();i++){
if(s[i]=='0'){
m=HT[m].lchild;
}
else
m=HT[m].rchild;
if(HT[m].lchild==-1&&HT[m].rchild==-1){
cout<<HT[m].weight<<endl;
m=2*n-2;
}
}
}
int main(){ //测试
int n;
string s;
cout<<"请输入待编码元素的个数:";
cin>>n;
int *w=(int *)malloc(n*sizeof(int));
cout<<"请输入待编码元素的权值:";
for(int i=0;i<n;i++)
cin>>w[i];
HFNode *HT;
HuffmanCode(HT,w,n);
cout<<"请输入待解码:";
cin>>s;
cout<<"解码结果为:"<<endl;
HuffmanEncode(HT,n,s);
system("pause");
霍夫曼编码及解码算法 霍夫曼编码 贪心算法
return 0;
}

  

爱华网本文地址 » http://www.413yy.cn/a/25101010/17656.html

更多阅读

Matlab实现霍夫变换 霍夫变换matlab代码

本代码提供了matlab下求取经过霍夫变换的直线斜率,并将其联合,代码见下方,实验结果见文末。%入口图像为BW,出口图像为f%optimizefrommain_optimize,merelyselect2lines,onehaspositive%slope,theotherhasnegativeslopeclearall,clo

小李飞刀--比埃尔霍夫我们曾经拥有 重生在小李飞刀

在昔年一个充满了暴力邪恶动乱的时代里,江湖中突然有一种飞刀出现了。没有人知道它的形状和式样,也没有人能够形容它的力量和速度。这就是“小李飞刀”。在今日动荡不安的欧洲足坛,也突然出现了这样一位前锋。他的传奇故事就像童话中的

浅谈视频格式2-固定码率CBR 与可变码率VBR cbr和vbr的区别

一般在我们输出视频文件的时候都会碰到一个选择即 CBR与VBR,CBR的英文全称是Constant BitRate翻译过来是固定码率就是说每一秒种的画面如果看做是一个静止的图片文件的话(实际上是每一帧的画面大小加起来)它大小是固定的,VBR的英文全称

MPEG-4视频编解码知识点 mpeg4视频下载

最近在泰瑞达找到工作,以后也不做嵌入式的东西了。现在把研究生几年来写的东西一点一点贴上来,留给有需要的人。对于有着巨大信息量的视频处理来说,需要研究出更高压缩比、更低码率、更清晰画质的编解码算法。到目前为止,视频编解码的

C语言在K叉哈夫曼编码教学中的应用 c语言哈夫曼编码译码

摘 要:字符编码与信息压缩是计算机应用的重要研究课题,许多学者对此作了很多非常有价值的研究。文章简单分析了二叉哈夫曼树的构造及编码,通过比较三种构造三叉哈夫曼树的算法,提出了构造任意K叉哈夫曼树及K进制的最优前缀编码的算法,并

声明:《霍夫曼编码及解码算法 霍夫曼编码 贪心算法》为网友傻瓜丿分享!如侵犯到您的合法权益请联系我们删除