Huffman编码算法实际上是一个贪心算法

每个字符都是二叉树的叶子结点,非叶子结点则不代表任何字符

有一组字符集{c1, c2, …, cn},字符集对应的权重{w1, w2, …, wn}

哈夫曼二叉树构建算法:

将字符集和权重构造成结点形成最小堆结点集S,

每次都从最小堆结点集S中选出权重值最小的两个结点x和y作为子节点进行建树,

为这两个子结点构造一个父节点,父节点不保存任何字符,父节点的权重为两个子节点权重之和,

将取出的两个子节点从集合S中移走,将父节点加入S中。

不断循环步骤2,3,4一直迭代下去,直到节点集合S只剩一个结点时,这个结点就是树的根节点。

这样我们就得到了一棵Huffman树,整个过程就是一个自底向上的建树过程。由于从根节点到每个叶子节点有且仅有一条路径,所以,每个叶子的路径都是不一样的,唯一的。我们把从根节点到叶子节点的路径记录下来,便可作为叶子节点上字符的编码。

哈夫曼编码算法:

在哈夫曼树中初始化编码为空,从根节点开始,往左走则编码加0,往右走则编码加1

哈夫曼树的定义代码实现:

public class HuffmanNode implements Comparable {

protected int key; // 权值

protected HuffmanNode left; // 左孩子

protected HuffmanNode right; // 右孩子

protected HuffmanNode parent; // 父结点

protected HuffmanNode(int key, HuffmanNode left, HuffmanNode right, HuffmanNode parent) {

this.key = key;

this.left = left;

this.right = right;

this.parent = parent;

}

}

构造哈夫曼树代码实现:

用堆来实现节点集合的存储!

public Huffman(int a[]) {

private HuffmanNode mRoot;

HuffmanNode parent = null;

MinHeap heap;

// 利用数组a建立最小堆

heap = new MinHeap(a);

for(int i=0; i

HuffmanNode left = heap.dumpFromMinimum(); // 最小节点是左孩子

HuffmanNode right = heap.dumpFromMinimum(); // 其次才是右孩子

// 新建parent节点,左右孩子分别是left/right;

// parent的大小是左右孩子之和

parent = new HuffmanNode(left.key+right.key, left, right, null);

left.parent = parent;

right.parent = parent;

// 将parent节点数据拷贝到"最小堆"中

heap.insert(parent);

}

mRoot = parent;

// 销毁最小堆

heap.destroy();

}

补充知识点:

最小堆:一种经过排序的完全二叉树,其中任一非叶节点的数据值均不大于其左子节点和右子节点的值。

待续!

参考文献:

求解哈夫曼编码Java实现,哈夫曼编码(Java)相关推荐

  1. 求解哈夫曼编码Java实现,用Java实现哈夫曼编码解决方法

    当前位置:我的异常网» J2SE » 用Java实现哈夫曼编码解决方法 用Java实现哈夫曼编码解决方法 www.myexceptions.net  网友分享于:2013-01-08  浏览:13次 ...

  2. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)

    哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...

  3. 哈夫曼编码 译码java_基于Java的哈夫曼编码译码系统_报告毕业论文

    基于Java的哈夫曼编码译码系统_报告毕业论文 1课 程 设 计Java 与面向对象程序设计课程设计基于 Java 的哈夫曼编码译码系统1.问题描述和分工情况1.1 问题描述使用 Java 语言实现哈 ...

  4. 使用Java实现哈夫曼编码(Huffman Coding)

    文章目录 (一)需求分析 (二)构建哈夫曼树 (三)构建哈夫曼编码 (四)哈夫曼编码的解码 (五)哈夫曼编码压缩的原理 (六)总结 (七)Java代码实现哈夫曼树:构建节点类&二叉树类 (八) ...

  5. java实现哈夫曼编码(huffman)编码

      这篇博客主要讲解如何用java实现哈夫曼编码(Huffman). 概念   首先,我来简单说一下哈夫曼编码(Huffman),它主要是数据编码的一种方式,也是数据压缩的一种方法,将某些特定的字符转 ...

  6. java中哈夫曼编码所用的函数_数据结构(java语言描述)哈夫曼编码

    原理:哈夫曼编码是根据将已给出的权值作为叶子结点,生成一颗哈夫曼树,然后使得权重最小. 首先生成已给权重的所有的叶子结点,然后取所有节点中最小和次小的结点作为左右孩子生成一个哈夫曼树,计算出父节点的权 ...

  7. Java实现哈夫曼编码

    一.内容 1.内部类 1> 哈夫曼树节点类型:HuTNode.class 2> 封装节点在底层数组的下标和对应的权重的类:IndexAndWeight.class 3> 封装字符和对 ...

  8. 哈夫曼树--顺序结构(建立、编码、解码)

    引子: 这里的哈夫曼树的建立方法和上一篇不一样,是把数据放在数组上面的,而不是链表上面.因此,采用这种方法建立的哈夫曼树对节点的操作上比链式的哈夫曼树简单很多.对于空间问题,如果有m个item,那么需 ...

  9. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

  10. 怎么用java构建哈夫曼树_Java代码构造哈夫曼树

    1.问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式.一个包含1 ...

最新文章

  1. 分割2021算法合集
  2. web开发下的各种下载方法
  3. 原来博客园的日历是这样用的!
  4. 查看Tomcat使用的版本
  5. (chap6 Http首部) 通用首部字段 Connection
  6. 统计学习方法第十五章作业:SVD矩阵分解 代码实现 及其在推荐的应用和矩阵压缩意义
  7. java的equals方法_Java Vector equals()方法与示例
  8. 解决在全文搜索中搜索中文字符
  9. jQuery——入门基础(获取元素、样式、属性,选择集、过滤器、样式类)
  10. python中的reindex_Python reindex使用详解
  11. 课程 3: Content Providers 简介
  12. 服务器监视Zabbix 5.0 - Window Agent安装
  13. php案例之后台数据显示-- mysqli面向对象版(Object Oriented Programming = OOP)
  14. 中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.6 结束语...
  15. Sphinx制作htmlhelp手册文档(Manual-chm)
  16. excel宏实现工作表索引,点击按钮隐藏/显示对应工作表
  17. 什么可以代替pencil?pencil代替品推荐
  18. linux带page参数报错,Linux配置hugepage
  19. 成长型思维和固定型思维
  20. 2021年美容师(初级)报名考试及美容师(初级)模拟考试题

热门文章

  1. SIM900A—发送、接收中英文短信
  2. 书籍之 Head First HTML与CSS
  3. 计算机系统常见故障分析与排除,电脑常见网络故障分析与排除方法
  4. 界面控件DevExpress WinForms v21.2 - 全新升级的图表控件
  5. Hybird app开发入门之Native和H5页面交互原理
  6. dll文件懒加载_模块已加载,但对dllregisterServer的调用失败
  7. 主流流媒体服务器软件,十款免费的流媒体服务器软件介绍
  8. 测绘的真正出路在于什么?
  9. ORCAD生成BOM单时不显示元器件封装
  10. 恒力弹簧设计及寿命预测