基本介绍

给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树(HuffmanTree)。
赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近

重要概念

  1. 路径和路径长度:
    在一棵树中,从一个结点往下可以达到的孩子节点之间的通路,称为路径通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1
  2. 结点的权及带权路径长度:
    若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积
  3. 树的带权路径长度:
    树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length),权值越大的结点离根结点越近的二叉树才是最优二叉树。
  4. WPL最小的就是赫夫曼树

赫夫曼树创建

例如:一个数组 arr={13,7,8,3,29,6,1};
排序后
arr={1,3,6,7,8,13,29};







代码实现:

package HuffmanTree;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 创建赫夫曼树* @author 86178**/
public class HuffmanTreeDemo {public static void main(String[] args) {int[] arr= {7,6,8,29,13,1,3};Node root=createTree(arr);pre(root);}//创建赫夫曼树public static Node createTree(int[] arr) {List<Node> list=new ArrayList<>();for(int v:arr) {list.add(new Node(v));}//list最终只剩root根结点while (list.size()>1) {Collections.sort(list);//排序Node left=list.get(0); //取出最小结点Node right=list.get(1); //取出次小结点Node parent=new Node(left.value+right.value);//新建父结点parent.left=left;//建立左节点关系parent.right=right;//建立右节点关系list.remove(left);//删除list.remove(right);//删除list.add(parent);//将父结点添加进list}return list.get(0);//返回root}//先序遍历打印结点信息public static void pre(Node head) {System.out.println(head);if (head.left!=null) {pre(head.left);}if (head.right!=null) {pre(head.right);}}
}
//实现Comparable接口,便于排序
class Node implements Comparable<Node> {int value;Node left;Node right;public Node(int v) {this.value=v;}public String toString() {return "[Node="+this.value+"]";}@Overridepublic int compareTo(Node o) {return this.value-o.value;}}

赫夫曼编码

  • 赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于一种程序算法。
  • 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。
  • 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间。
  • 赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出种编码方法,称之为最佳编码。

定长编码

  • 例如: 一个字符串,s=“i like java”;共有11个字符,包括空格
  • 对应ASCII码值为 105 32 108 105 107 101 32 106 97 118 97
  • 进一步转换为二进制为 01101001 00100000 01101110 01101001 01101011 01100101
    00100000 01101010 01100001 01110110 01100001
  • 最终按照二进制传递信息,总长度为98,包括空格。

变长编码

  • 例如: 一个字符串,s=“i like like like java do you like a java”;共有40个字符,包括空格
  • 统计各个字符出现的个数 d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
  • 对应编码: 0=,1=a,10=i, 11=e,100=k,101=l,110=o,111=v,1000=j, 1001=u,1010=y, 1011=d
  • 说明:按照各个字符出现的次数进行编码,原则是出现次数越多的,则编码越小,比如 空格出现了9次,编码为0,其它依次类推.
  • 按照上面给各个字符规定的编码,则我们在传输“i like like like java do you like a
    java"数据时,编码就是10010110100…
  • 字符的编码都不能是其他字符编码的前缀,符合此要求的编码叫做前缀编码,即不能匹配到重复的编码。

赫夫曼编码

  • 例如: 一个字符串,s=“i like like like java do you like a java”;共有40个字符,包括空格
  • 统计各个字符出现的个数 d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
  • 构建赫夫曼树
  • 根据赫夫曼树,给各个字符规定编码,向左的路径为0,向右的路径为1
  • 编码如下: o: 1000 u: 10010 d:100110 y: 100111 i: 101a : 110k: 1110e: 1111j: 0000v: 0001l: 001 : 01
  • 按照上面的赫夫曼编码,我们的"i like like like javado you like a java"字符串对应的编码为(注意这里我们使用的无损压缩)
    1010100110111101111010011011110111101001101111011110100001100001110011001111000011001111000100100100110111101111011100100001100001110
    长度为:133
  • 说明:原来长度是359,压缩了(359-133)/ 359= 62.9%2)此编码满足前缀编码,即字符的编码都不能是其 他字符编码的前缀。不会造成匹配的多义性

注意,这个赫夫曼树根据排序方法不同(有多个相等的值),也可能不太一样,这样对应的赫夫曼编码也不完全一样,但是wpl是一样的,都是最小的。

赫夫曼树、赫夫曼编码相关推荐

  1. 赫夫曼树赫夫曼编码的创建

    目录 基础知识点 最优二叉树 如何构造赫夫曼树 赫夫曼编码 编码与压缩文件 代码 结构体设计 创建赫夫曼树 创建构建赫夫曼编码 基础知识点 赫夫曼树又称为最优树,是一种带权路径长短最短的树,有着广泛的 ...

  2. 数据结构与算法(赫夫曼树,赫夫曼编码)

    赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...

  3. 赫夫曼树+赫夫曼编码小结

    赫夫曼树 赫夫曼树定义与原理 从树中一个节点到另一个节点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度. 图6-12-4的二叉树a中,根结点到结点D的路径长度就为4,二叉树b中根结点到 ...

  4. 树:赫夫曼树赫夫曼编码

    1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...

  5. 【数据结构】赫夫曼树与赫夫曼编码(可执行完整代码)

    赫夫曼编码对文件进行压缩与解密 理论 赫夫曼树 赫夫曼编码 应用 应用源码 运行结果截图 理论 赫夫曼树 先有赫夫曼树,才有赫夫曼编码.所以,首先简单介绍一下什么是赫夫曼树. 假设一共五个叶子节点,分 ...

  6. 赫夫曼编码(基于赫夫曼树的实现)

    上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...

  7. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

  8. 赫夫曼树以及赫夫曼编码实现

    介绍 赫夫曼树创建图解思路 一直找就找到最好的样子: 赫夫曼树创建代码实现 package 树;import java.util.ArrayList; import java.util.Collect ...

  9. 赫夫曼树介绍、赫夫曼树的性质、赫夫曼编码、赫夫曼树与赫夫曼编码的应用

    文章目录 赫夫曼树 1. 赫夫曼树介绍: 2. 赫夫曼树的创建过程: 3. 赫夫曼树的性质: 4. 赫夫曼编码: 5. 赫夫曼树与赫夫曼编码的c语言代码实现: 赫夫曼树 1. 赫夫曼树介绍: ​ 赫夫 ...

最新文章

  1. eclipse下的spring环境配置
  2. 6 不更新无法使用_win10更新后无线网络无法使用
  3. 华为 鸿蒙 操作系统关键特性解读
  4. postfix导致maillog填满磁盘空间的巨坑!
  5. 交换两个数字的三种方式
  6. ajax分批mysql_使用select2分批异步加载大量数据
  7. Go语言面向对象编程
  8. sentinel 打包_SpringCloud Alibaba整合Sentinel
  9. 《R数据可视化手册》——3.8 绘制百分比堆积条形图
  10. sql 语句循环方法的使用
  11. ucore Lab1 系统软件启动过程
  12. 代表JAVA线程优先级的常量是_Java 线程优先级
  13. 浏览器播放视频时蓝牙耳机自动关机
  14. 实验吧web天网管理系统
  15. WPS参考文献自动生成方法
  16. cl.3hh.win/index.php,windows 系统下 安装 gitblit 教程
  17. MAC无法重装anaconda3
  18. 在编译前与后调教C语言binary的一种方法
  19. 不定式作各种成份和现在分词作各种成份
  20. CentOS 7 更改 任务栏 高度

热门文章

  1. acwing349 黑暗城堡 ——最短路径生成树
  2. linux中的wget命令
  3. 【实践】haskell、coq基本语法
  4. Diabetes 糖尿病及其并发症.|2021/1/25(未完待续)
  5. 网络舆情系统的四大要素-张华平博士
  6. 中山大学新华学院计算机,中山大学新华学院信息科学学院电子信息科学与技术、计算机科学与技术、软件...
  7. 1.主流的流媒体服务器FMS/wowza/red5/SRS产品对比
  8. 好用并强大的图片插件:PhotoSwipe.js
  9. 单继承与多继承的虚函数表
  10. visual svn for visual studio 2019