【数据结构和算法】哈夫曼树及其应用

简介: 【数据结构和算法】哈夫曼树及其应用

引子


当操作的数目很大的时候,有时候只需要改变一下判断的顺序,可以减少执行时间,两种判别树的效率是不一样的。

image.png

哈夫曼树就是一种效率最高的判别树,也称之为最优二叉树。


一、哈夫曼树的基本概念


  • 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
  • 结点的路径长度:两个结点路径上的分支数。
  • 数的路径长度:从树根到每一个节点的路径长度之和。记作:TL
  • 结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树。
  • image.png
  • 权:将树中结点赋给一个存有某种含义的数值,则这个数值称为该结点的权。
  • 结点的带权路径长度:从根节点到该结点之间的路径长度与该结点的权的乘积。
  • 树的带权路径长度:树中所有的叶子结点的带权路径长度之和。
  • image.png

例子:

image.png

哈夫曼树就是带权路径长度最短的树。


如何构造哈夫曼树?

构造方法如下:

image.png

具有相同带权结点的哈夫曼树不唯一。

例子一:

image.png

 包含n棵树的森林要经过n-1次结合才能形成哈夫曼树,共产生n-1个新节点。所以包含n个叶子节点的哈夫曼树中共有2n-1个及结点。且哈夫曼树的节点的度数只有0或2,没有1.


例子二:

image.png


二、哈夫曼树的存储结构


  • 采用顺序存储结构----一维结构数组
  • 结点类型定义

存储结构如下所示:

typedef struct{
  int weight; //权值
  int parent,lch,rch; //双亲结点,左孩子结点,右孩子结点
}HTNode,*HuffmanTree;


构建哈夫曼树思路

例子:

image.png


哈夫曼树初始化与实现

伪代码如下,比较容易理解:

void CreateHuffmanTree(HuffmanTree HT,int n){
  if(n <= 1)  return;
  m = 2*n-1;      //数组共2n-1个元素
  HT = new HTNode[m+1]; //HT[m]表示根节点
  for(i = 1; i < m; i++){ //将2n-1个元素的lch,rch,parent置0
  HT[i].lch = 0;
  HT[i].rch = 0;
  HT[i].parent = 0;
  }
  for(i = 1; i < m; i++){ //输入前n个元素的weight值
  cin >> HT[i].weight;
  }
  for(i = n+1; i < m; i++){ //合并产生n-1个结点
  Select(HT, i-1, s1,s2);     //选择两个双亲为0且权值为最小的结点,返回在HT中的s1,s2序号
  HT[s1].parent = i;HT[s2].parent = i;  //从表中删除s1,s2
  HT[i].lch = s1;HT[i]rlch = s2;    //s1,s2分别作为i的左右孩子
  HT[i].weight = HT[s1].weight +   HT[s2].weight; //i的权值为左右孩子权值之和
  }
}


三、哈夫曼编码


如何编码使得电文总长最短? -----哈夫曼编码

image.png

例子:如上编码就不会有歧义

image.png

特点:

  • 哈夫曼编码能够保证是前缀编码,因为每一个结点路径都是不一样的;
  • 哈夫曼树能保证字符编码总长度最短,因为本来哈夫曼树的带权路径长度最短。

image.png


四、哈夫曼编码算法实现


从底层反推到跟结点,判断是是左孩子还有孩子,然后标志01.


cd[start]:用来不断的存储标志01

HC[i]:用来存储结果

HT[i]:哈夫曼树结构

image.png

代码实现:

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n){
  //从叶子到跟逆向求每个字符的哈夫曼编码,存储到编码表中
  HC = new char* [n+1]; //分配n个字符编码的头指针矢量
  cd = new char[n];  //分配临时存放编码的动态数组空间
  cd[n-1] = '\0';   //编码结束符
  for(i = 1; i <= n; i++)
  {
  start = n-1;  
  c = i;
  f = HT[i].parent;
  while( f != 0)  //当还不是根节点时一直回溯
  {
    start--;
    if(HT[f].lchild == c) //结点c是f的左孩子,则生成代码0
    cd[start] = '0';
    else      //结点c是f的右孩子,则生成代码1
    cd[start] = '1';
    c = f;      //以下两步是回溯的作用
    f = HT[f].parent;  //自己成为双亲再查找    
  }
  HC[i] = new char[n - start];//为第i个字符串编码分配空间
  strcpy(HC[i],&cd[start]); //将求得的编码从临时空间cd复制到HC的当前行中
  }
  delete cd;    //释放临时空间
}


五、哈夫曼编码-文件的编码和解码


  1. 编码实现过程

image.png

  1. 解码实现过程

image.png

  1. 例子

image.png

目录
相关文章
|
10天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
50 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
50 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
119 4
|
12天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
10天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
45 0
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
70 5
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
52 1