数据结构

–赫夫曼树

文章目录

  • 数据结构
    • 一.一些概念
    • 二.最优二叉树(赫夫曼树)
    • 三.赫夫曼树的构造
    • 四.赫夫曼编码
    • 五.前缀编码
一.一些概念
  1. 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
  2. 路径长度:路径上的分支数目
  3. 树的路径长度:从树根到每个结点的路径长度之和
    路径长度为 = 1*2 + 2*3 + 3*1 = 11(第一个乘数表示层数)
  4. 结点的带权路径长度:从结点到树根之间的路径长度与结点上权的乘积
  5. 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和
    WPL = 2*5 + 3*3 + 2*4 = 27(第一个乘数表示层数)
二.最优二叉树(赫夫曼树)

假设二叉树有n个叶子,其每个叶子结点带权wi,则带权路径长度WPL最小的二叉树称为最优二叉树或赫夫曼(Huffman)树。

三.赫夫曼树的构造
  1. 在赫夫曼树中,权值最大的结点离根最近,权值最小的结点离根最远。
  2. 算法:
    (1)根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F{T1, T2, …, Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,左右子树为空。
    (2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置其根结点的权值为其左右子树根结点的权值之和。
    (3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
    (4)重复(2),(3),直到F只含一棵树为止。
    设已知权值W = {5, 6, 3, 9,7}, 求赫夫曼树。
四.赫夫曼编码

赫夫曼编码按各个字符出现的概率不同而给予不等长编码,可望减少编码总长度。
设给出一段报文:GOOD_GOOD_GOOD_GOOOOOOOO_OFF,字符集合是 { O, G, _, D, F},各个字符出现的频度(次数)是 W={ 15, 4, 4, 3, 2}。
(1)若给每个字符以等长编码:
  O: 000 G: 001 _: 010 D: 011 F: 100
则总编码长度为 (15+4+4+3+2) * 3 = 84
(2)若给每个字符以不等长编码(赫夫曼编码):
各字符{ O, G, _, D, F }出现概率为 { 15/28, 4/28, 4/28, 3/28, 2/28 }, 化整为{ 15, 4, 4, 3, 2 }
如果规定,Huffman树的左子树小于右子树,令左孩子分支为编码‘0’,右孩子分支为编码‘1’,则可构成Huffman树:


将根结点到叶子结点路径上的分支编码,组合起来,作为该字符的Huffman码,则可得到:
  O:1 _:011 G:010 D:001 F:000
则总编码长度为 15*1+(2+3+4+4)*3 = 54 < 84

  1. 编码实现
    (1)Huffman树的构造:
    n个叶子结点的Huffman树共2n-1个结点。(两两合并,直至一个,共生成n-1个结点)用静态链表实现, 结构如下。
    (2)算法:
    ----设静态链表为HT,计算过程如下:
    ① 初始令n=叶子结点数,设置0~n-1结点的data、weight,并令所有单元的parent,lchild,rchild为-1
    ② 从0~n-1中选取parent为-1,权值最小的两个结点,设为s1,s2,令n为此两结点的父结点,修改:
    HT[s1].parent = n; HT[s2].parent = n;
    HT[n].lchild = s1; HT[n].rchild = s2;
    HT[n].weight = HT[s1].weight+HT[s2].weight;
    HT[n].parent = -1;
    n++;
    ③ 重复②直至n=2*叶子结点数-1
    ----编码从叶子结点开始。对每个叶子结点k ,
    ① parent = HT[k].parent;
    若HT[parent].lchild = k; 则code=“0”+code;
    若HT[parent].rchild = k; 则code=“1”+code ;
    k = parent;
    ② 重复①直至HT[k].parent = -1;
    ③ 每个字符的编码值为string类对象code;
    ----用字符数组 char code[n]存放单结点编码。
  2. 解码实现
    (1)假设待解码字符串为s。
    思路:令k=树根,依次读s的每个字符,若为0,走k的左子树;
    为1,走k的右子树,直到走到叶结点,该节点即为得到的解码字符。
    重复上述过程,直到s串结束。
    若s串结束,k非树根,则解码失败。
    (2)算法:
    从树根开始,具体算法描述如下:
    ① 初始令k = 2n-2,i=0
    ② 若i>=s.length(),转⑥
    ③ 若s[i]=‘0’,则k = HT[k].lchild;否则,k=HT[k].rchild;
    ④ 若HT[k].lchild=-1且HT[k].rchild=-1,则解码串加HT[k].node, k=2n-2
    ⑤ i++,转②。
    ⑥ 若k=2n-2,解码正确,否则解码不正确。
五.前缀编码

若设计长短不等的编码,则必须是任一个字符的编码都不是另一个字符编码的前缀,称为前缀编码。
利用赫夫曼树可以构造一种不等长的二进制编码,并且构造所得的赫夫曼编码是一种最优前缀编码,即使所传电文的总长度最短。

数据结构--赫夫曼树相关推荐

  1. 数据结构 - 赫夫曼树

    wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接,然后循环就可以了 package tree.huffmantree;import java.util.ArrayLi ...

  2. 数据结构--赫夫曼树及其应用

    讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchil ...

  3. 数据结构-赫夫曼树(三)

    Huffman Tree 哈夫曼树 霍夫曼树 概念 代码实现: 概念 路径和路径长度: 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路 路径长度: 通路中分支的数目称之为路径长度. 根节点 ...

  4. 【数据结构】赫夫曼树

    数据结构赫夫曼树 /*名称:赫夫曼树语言:数据结构C语言版 编译环境:VC++ 6.0日期: 2014-3-26 */#include <stdio.h> #include <lim ...

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

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

  6. 【赫夫曼树数据结构及其应用】

    本文主要介绍Java中赫夫曼树数据结构的基本原理.实现方式以及使用场景.赫夫曼树(Huffman Tree)是一种带权路径最短的二叉树,广泛应用于数据压缩和编码等领域. 一.赫夫曼树的基本概念 赫夫曼 ...

  7. 数据结构(十五)— 树结构之赫夫曼树及其应用

    现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...

  8. java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)

    一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...

  9. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

最新文章

  1. 利用克鲁斯卡尔算法求最小生成树
  2. idea写java spark程序,Spark : 在IDEA中用scala编写Spark的WordCount程序并提交运行
  3. sessionkey 微信小程序获取_微信小程序获取sessionkey,Connection reset
  4. wpf mysql课程设计_使用 WPF 和 MySQL 搭建小型人资管理系统——主要页面
  5. 2016计算机二级java_2016年计算机二级《JAVA》考试练习题
  6. 小强地狱(Bug Hell)——优先级和缺陷修改的平衡
  7. python有哪几种数据结构_Python最常用的数据结构6种
  8. 前端的一些实用算法题
  9. 2018蓝桥杯校选复现3
  10. scrapy多个url爬虫
  11. 谷歌浏览器开发工具调试样式
  12. MATLAB 棋盘格图片校准
  13. “0基础考生考前三小时突破《申论》80分气哭学霸”——单一题(问题+影响)
  14. 孤尽班第22天 -- 系统安全规约
  15. 数仓存在的意义价值及分层的好处
  16. Object,byte[],ByteBuffer之间的转换。
  17. springCloud五大神兽(思维导图)
  18. 掌握这 10 大算法,就可以主宰世界!
  19. Java----jar包
  20. H5移动端开发基础(三)自定义滚动条、实战-音悦台

热门文章

  1. 工信部专家:中国传感器最大的问题是什么?怎么解决?(最新观点)
  2. android 宏替换_Android.mk常用宏定义
  3. 翻转英文句子中单词的顺序
  4. Aws云服务EMR使用
  5. 基于AWS云服务的Web应用架构
  6. 将linux系统装入U盘,制作便携式linux系统。
  7. 电脑桌面图标右下角显示有白色文本框
  8. ArcGIS中的标注“分数样式”实现
  9. 毕业论文终于接近尾声了
  10. Systemverilog(绿皮书)学习日记(1)— 数据类型