数据结构---哈夫曼编码

来源:互联网 发布:js移除元素 编辑:程序博客网 时间:2024/05/29 13:20
#include<iostream>#include<string>using namespace std;#define max 100#define INF 33333333333typedef struct{string data;  //结点值double weight;//权重int parent,lchild,rchild;}HTnode;HTnode ht[max];typedef struct{char cd[max];//存放当前结点的哈夫曼编码int start;//存放该结点哈夫曼编码的起始位置}HCode;HCode hcd[max];/**n:n个叶子结点,共有2n-1个结点*/void createHTnode(HTnode ht[],int n)//构造哈夫曼树{int i,k,lnode,rnode;double min1,min2;for(i=0;i<2*n-1;i++)ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for(i=n;i<=2*n-2;i++){min1=min2=INF;lnode=rnode=-1;for(k=0;k<=i-1;k++)//在ht[0...i-1]中找权值最小的两个结点{if(ht[k].parent==-1){if(ht[k].weight<min1){min2=min1;rnode=lnode;min1=ht[k].weight;lnode=k;}else if(ht[k].weight<min2){min2=ht[k].weight;rnode=k;}}}ht[i].weight=ht[lnode].weight+ht[rnode].weight;ht[i].lchild=lnode;ht[i].rchild=rnode;ht[lnode].parent=i;ht[rnode].parent=i;}}void createHCode(HTnode ht[],HCode hcd[],int n0)//根据哈夫曼树求对应的哈夫曼编码{int i,f,c;HCode hc;for(i=0;i<n0;i++){hc.start=n0;c=i;f=ht[i].parent;while(f!=-1){if(ht[f].lchild==c)hc.cd[hc.start--]='0';elsehc.cd[hc.start--]='1';c=f;f=ht[f].parent;}hc.start++;//start指向哈夫曼编码的最开始的字符hcd[i]=hc;}}void display(HTnode ht[],HCode hcd[],int n){int i,k;int sum=0,m=0,cnt;cout<<"哈夫曼编码为:"<<endl;for(i=0;i<n;i++){cnt=0;cout<<ht[i].data<<"\t"<<":";          for (k=hcd[i].start; k<=n; k++)          {              cout<<hcd[i].cd[k];              cnt++;          }          m+=ht[i].weight;          sum+=(ht[i].weight*cnt);          cout<<endl;      }      cout<<"平均长度="<<(float)sum/m<<endl;}int main(){int n=15;      string str[]= {"The","of","a","to","and","in","that","he","is","at","on","for","His","are","be"};      int f[]= {1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123};      for (int i=0; i<n; i++)      {          ht[i].data=str[i];          ht[i].weight=f[i];      }      createHTnode(ht,n);      createHCode(ht,hcd,n);      display(ht,hcd,n);      return 0;  return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网贷负债十几万怎么办 赌博欠了十几万怎么办 欠了网贷跑了会怎么办 欠银行钱还不起怎么办 欠小额贷款公司的钱还不上怎么办 负债30万没工作怎么办 华为p9耗电太快怎么办 酷派手机反应慢怎么办 网上买手机被骗了怎么办 买手机贵了怎么办12315 在手机店被骗了怎么办 在转转上被骗了怎么办 微信被骗了800怎么办 苹果6被偷走该怎么办 苹果7被偷走该怎么办 月经量突然少了怎么办 我月经老是不来怎么办 月经不来3个月怎么办 月经推迟3个月怎么办 乙肝五项25阳怎么办 乙肝五项25阳性怎么办 流浓鼻涕怎么办速效办法 鼻涕又浓又黄绿怎么办 玉露已经徒长了怎么办 多肉长出了多头怎么办 多肉已经徒长了怎么办 脖子抻筋了 很疼怎么办 声带肥大造成说话声音沙哑怎么办 轻微的骨性龅牙怎么办 19岁没了晨勃怎么办 早上晨勃消失了怎么办 阴茎勃而不坚怎么办 一个月婴儿痰多怎么办 孕妇咳绿色浓痰怎么办 买的戒指大了怎么办 孩子鞋子买大了怎么办 鞋子不大但掉跟怎么办 鞋子长了一码怎么办 新鞋有点顶脚怎么办 宝宝鞋子买小了怎么办 鞋子买的小了怎么办