哈弗曼编码

基本思想

  • 以字符的使用频率作为权构建一颗哈弗曼树,然后利用哈弗曼树对字符进行编码。
  • 构造一颗哈弗曼树,是将要编码的字符作为叶子节点,该字符在文件中的使用频率作为叶子节点的权值,以自底向上的方式,通过n-1次的‘合并’后构造的一棵树,核心思想是权值越大的叶子离跟很近。

贪心策略

  • 每次从树的集合中取出没有双亲且权值最小的两颗树作为左右子树

算法步骤

  1. 确定合适的数据结构。需要考虑情况有:
    • 哈弗曼树中没有度为一的节点,则一颗有n个叶子节点的哈弗曼树共有2n-1个节点(n-1次的合并,每次产生一个新节点)
    • 构成哈弗曼树后,为求编码,需从叶子节点出发走一条从叶子到根的路径。
    • 译码需要从根出发走一条从根到叶子的路径,那么我们需要知道每个节点顶点权值、双亲、左孩子、右孩子和节点的信息。
  2. 初始化。构造n棵节点为n个字符的单节点树集合T={t1,t2,t3,...,tn},每棵树只有一个带权的根节点,权值为该字符的使用频率。
  3. 如果T中只剩下一棵树,则哈弗曼树构造成功,调到步骤6。否则,从集合T中取出没有双亲且权值最小的两棵树ti和tj,将他们合并成一颗新树Zk,新树的左孩子为ti,右孩子为tj,Zk的权值为ti和tj的和。
  4. 从集合T中删除ti和tj,加入Zk。
  5. 重复步骤3-4。
  6. 约定做分支上的编码为“0”,右分支上的编码为“1”。从叶子节点到根节点逆向求处每个字符的哈弗曼编码,从根节点到叶子节点的路径上的字符组成的字符串为该叶子节点的哈弗曼编码。算法结束
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 先从文本读取字符,统计字符出现的次数用map保存,然后根据词频计算每个字符的哈弗曼编码,哈弗曼树的建立过程就是每次...
    lxhao阅读 1,720评论 0 1
  • 哈夫曼编码 本人比较懒....关于哈夫曼树知识点的介绍就不在博客上说了, 请同学们自行查阅相关资料, 直接上代码,...
    刘翾阅读 4,434评论 0 2
  • 代码: 测试文件: 原始文件,q1.txt: 根据q1编码结果,写出对and的编码,q2.txt: 运行结果: 有...
    yigoh阅读 2,962评论 1 1
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,953评论 1 31
  • 简介 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。 定义:给定 n 个权值作为 n 个叶子节点,构造...
    随时学丫阅读 8,425评论 0 1

友情链接更多精彩内容