哈夫曼树(霍夫曼树)-详解

  • 哈夫曼树(霍夫曼树)-详解

    • 何为权值?我们看下百度百科的解释。
    • 何为路径?
    • 何为路径长度?
    • 何为树的路径长度?
    • 何为结点的带权路径长度?
    • 何为树的带权路径长度(WPL)?
    • 哈夫曼树(霍夫曼树)介绍

在了解哈佛曼树前,需要先了解,何为权值,何为路径,以及权值计算。

何为权值?我们看下百度百科的解释。

by:百度百科
在数学领域,权值指加权平均数中的每个数的频数,也称为权数或权重。
计算机领域中(数据结构)
权值就是定义的路径上面的值。可以这样理解为结点间的距离。通常指字符对应的二进制编码出现的概率。
至于[哈夫曼树]中的权值可以理解为:权值大表明出现概率大!
一个结点的权值实际上就是这个结点子树在整个树中所占的比例.
abcd四个[叶子结点]的权值为7,5,2,4, 这个7,5,2,4是根据实际情况得到的,比如说从一段文本中统计出abcd四个字母出现的次数分别为7,5,2,4. 说a结点的权值为7,意思是说a结点在系统中占有7这个份量。实际上也可以化为百分比来表示,但反而麻烦,实际上是一样的。

何为路径?

连接两个节点的线就是路径。

何为路径长度?

从顶点到 1,其需要经过 a 、b 路径。那么路径长度就为2

何为树的路径长度?

从树的顶点,到各个节点的路径长度总和,即为树的路径长度。

何为结点的带权路径长度?

结点权即为本身数值,而结点的带权路径长度为从树的订单到结点的路径长度与结点的权 数值乘积。
公式: 结点的带权路径长度 = 结点的路径长度 * 结点的带权值

例:上图,从顶点到对应结点,那么它的带权路径长度为 2 x 100 = 200

何为树的带权路径长度(WPL)?

树的带权路径长度为结点的带权路径长度之和。可参考上图。

哈夫曼树(霍夫曼树)介绍

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

一个二叉树的带权路径长度(WPL)最小,才能为哈夫曼树。而要使得WPL最小,则需要结点权值最大越靠近顶点,而结点权值越小离顶点越远。
以下为图示的简单例子:

package com.base.data.tree;
/*** 创建一个结点,包含权重信息 * @param <E>*/
public class HuffTreeNode<E> {E data;double weight;HuffTreeNode leftNode;HuffTreeNode rightNode;public HuffTreeNode(E data,double weight) {this.data = data;this.weight = weight;}public HuffTreeNode(E data, double weight, HuffTreeNode leftNode, HuffTreeNode rightNode) {this.data = data;this.weight = weight;this.leftNode = leftNode;this.rightNode = rightNode;}
}
package com.base.data.tree;import java.util.*;public class HuffTree {/*** 创建哈夫曼树 * @param huffTreeNodeList {@link HuffTreeNode}* @return 返回树*/  public HuffTreeNode createHuffTree(List<HuffTreeNode> huffTreeNodeList){while(huffTreeNodeList.size() > 1){//排序sortHuffTrees(huffTreeNodeList);int size = huffTreeNodeList.size();//从尾部开始循环HuffTreeNode leftNode = huffTreeNodeList.get(size-1);HuffTreeNode rightNode = huffTreeNodeList.get(size-2);//创建父结点HuffTreeNode parentNode = new HuffTreeNode(null,leftNode.weight+rightNode.weight);parentNode.leftNode = leftNode;parentNode.rightNode = rightNode;huffTreeNodeList.remove(size-1);huffTreeNodeList.remove(size-2);huffTreeNodeList.add(parentNode);}return huffTreeNodeList.get(0);}/*** 冒泡排序 结点的权重信息 从大到小 * @param huffTreeNodeList*/public void sortHuffTrees(List<HuffTreeNode> huffTreeNodeList){int i = huffTreeNodeList.size()-1;while (i > 0){int post = 0;for (int i1 = 0; i1 < i; i1++) {if(huffTreeNodeList.get(i1).weight < huffTreeNodeList.get(i1+1).weight){post = i1;HuffTreeNode temp = huffTreeNodeList.get(i1+1);huffTreeNodeList.set(i1+1,huffTreeNodeList.get(i1));huffTreeNodeList.set(i1,temp);}}i = post;}}public void printNode(HuffTreeNode huffTreeNode){System.out.println(huffTreeNode.weight);if(huffTreeNode.leftNode != null){System.out.println(huffTreeNode.leftNode.weight);printNode(huffTreeNode.leftNode);}if(huffTreeNode.rightNode != null){System.out.println(huffTreeNode.rightNode.weight);printNode(huffTreeNode.rightNode);}}public static void main(String[] args) {HuffTree huffTree = new HuffTree();List<HuffTreeNode> huffTreeNodeList = new ArrayList<>();for(int i=0;i<1000;i++){Random random = new Random();double randomDouble = random.nextInt(100000);huffTreeNodeList.add(new HuffTreeNode("A结点"+i, randomDouble));}huffTree.createHuffTree(huffTreeNodeList);huffTree.printNode(huffTreeNodeList.get(0));}
}

哈夫曼树(霍夫曼树)-详解相关推荐

  1. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

  2. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  3. K近邻算法和KD树详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  4. 蒙特卡洛树搜索(MCTS)详解

    蒙特卡洛树搜索(MCTS)详解 蒙特卡洛树搜索是一种经典的树搜索算法,名镇一时的 AlphaGo 的技术背景就是结合蒙特卡洛树搜索和深度策略价值网络,因此击败了当时的围棋世界冠军.它对于求解这种大规模 ...

  5. 快速画出哈夫曼树/霍夫曼树/最优树

    2019独角兽企业重金招聘Python工程师标准>>> 哈夫曼树(霍夫曼树)又称为最优二叉树. n个叶子结点的哈夫曼树共有几个结点 ? Huffman 树是所谓的正则二叉树,只有度为 ...

  6. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

  7. 哈夫曼树(赫夫曼树、最优树)详解

    赫夫曼树,别名"哈夫曼树"."最优树"以及"最优二叉树".学习哈夫曼树之前,首先要了解几个名词. 哈夫曼树相关的几个名词 路径:在一棵树中, ...

  8. 霍夫曼(Huffman)编码算法详解之C语言版

    一.Huffman编码 霍夫曼(Huffman)树是一类带权路径长度最短的二叉树树.Huffman树的一个非常重要的应用就是进行Huffman编码以得到0-1码流进行快速传输. 在电报收发等数据通讯中 ...

  9. OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测

    1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最 ...

  10. 缺点 霍夫圆_霍夫圆变换

    对于直线来说,一条直线能有参数极径级角表示,而对圆来说我们需要三个参数来表示一个圆 在OpenCV中,我们常常通过一个叫"霍夫梯度法"的方法来解决圆变换的问题. 霍夫梯度法的原理 ...

最新文章

  1. 《笑傲网湖》第五回 状态检测防火墙
  2. IQ01/IQ02 Create/Change Material Serial Number BAPI
  3. python中利用matplotlib画图
  4. 英语进阶系列-A06-本周总结
  5. Win8.1部署 .NET Framework 3.5 安装方式汇总
  6. 通信原理基础知识概括
  7. zeros函数和ones函数的用法
  8. JM8.5中的高精度象素运动估计
  9. DNS是什么?DNS什么用?
  10. 安卓开发中的一些经验总结
  11. 【数据库】Mysql索引究竟是什么?
  12. 计算机常用英语词汇表
  13. 任正非称华为没有 996 也没 007;Twitter 员工可永久在家办公
  14. 制造业ERP管理系统在企业管理中发挥什么作用?
  15. 【genius_platform软件平台开发】第九十四讲:int64_t的格式化问题(lld和PRId64)
  16. Oracle表空间及数据文件操作
  17. 软件需求工程 高校教学平台 系统维护计划
  18. swoole基础之http-server
  19. java自动化测试语言高级之Applet 基础
  20. 64位处理器_CAD安装包32位跟64位有什么区别吗?

热门文章

  1. Evasion Techniques and Breaching Defenses by Offensive Security学习笔记
  2. case when then 中的条件里面加上 and or 的写法
  3. C++整数篇 十进制转二进制
  4. Games103 勘误
  5. python核心编程(第二版)-算术游戏
  6. 【八大排序(一)】排序还只会用冒泡?进来给我学!
  7. IPV6地址中的%号什么意思
  8. 区块链技术与应用(北大公开课,肖臻)-ETH 交易树和收据树
  9. 什么是次时代游戏?这行业为什么那么火,几点你肯定不知道
  10. 【190320】C# 写的简易千千静听播放器源代码