前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >哈夫曼树 编码-【数据结构】树形结构——哈夫曼编码

哈夫曼树 编码-【数据结构】树形结构——哈夫曼编码

作者头像
囍楽云
发布2022-12-29 09:14:08
4940
发布2022-12-29 09:14:08
举报
文章被收录于专栏:囍楽云博客

目录

  一、哈夫曼编码的概念

  在电报业务和数字通信中,可以用0和1组成的编码表示一个字母或其他字符,用编码序列表示字符序列以进行远距离传送。长途通信的代价是比较高的,希望用尽可能短的编码序列长度来传递给定的信息量,以提高通信的效率和降低传输的成本。

  如果根据字符出现的次数为每个字符设计长度不等的编码,使用频率高的字符采用尽可能短的编码,则传送电文的总长便可减少。但是长短不同的编码也会给翻译带来不便,产生歧义。因此,若要设计长短不等的编码,则必须是任一个字符编码都不是另一个字符编码的前缀,这种编码称作前缀编码。

  若需要编码的字符为C1、C2哈夫曼树 编码,……,Cn,它们在电文中出现的频率分别为W1、W2,……,Wn,以字符作为叶子结点构造一棵哈夫曼树。规定哈夫曼树中每个分支结点的左分支表示0,右分支表示1,将从根结点到每个叶子结点所经过路径上的0和1连接起来,作为叶结点所代表字符的编码。这样得到的编码称为哈夫曼编码。在哈夫曼编码中,每个字符的编码长度就等于根结点到字符所在叶子结点的路径长度。由哈夫曼树的定义可知,哈夫曼树是带权路径长度最小的二叉树,树的路径长度就是每个字符的编码长度与其出现频率的乘积之和,因此利用哈夫曼树构造的编码总长度最短。由于从根到叶结点只有一条唯一的路径,且不经过其他叶子结点,因此哈夫曼编码是一种不等长的前缀编码。

  二、哈夫曼编码的实现

  哈夫曼编码过程由于是从叶子向上追溯到根,编码过程记录下的是每一个字符逆序的编码,因此除了存储从叶子到根经过的编码外,还需记录编码的起始位置start。每个字符的哈夫曼编码的存储结构定义如下:

   struct{

  int bitMAXBIT;

  int start;

  };

  生成哈夫曼编码的过程如下:

  (1)由叶子结点出发,向上直到树根,向上的过程中,结点若为其双亲的左孩子,则编码为0;否则编码为1,由于是从叶子向上追溯到根,所以编码也是从后向前哈夫曼树 编码,记住编码的起始位置start。

  (2)直到所有叶子结点均编码结束为止。

  void ( [], [],int n){

   cd;

  int i,j,c,p;

  for(i=0;i

  cd.start=n-1;

  c=i;

  p=c.parent;

  while(p!=1){

  if(p.lchild==c)

  cd.bitcd.start=0;

  else

  cd.bitcd.start=1;

  cd.start--;

  c=p;

  p=c.parent;

  }

  for(j=cd.start+1;j

  i.bitj=cd.bitj;

  }

  i.start=cd.start;

  }

  }

本文共 707 个字数,平均阅读时长 ≈ 2分钟

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档