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

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

引子


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

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

目录
相关文章
|
24天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
61 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
14天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
27 1
|
20天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
20天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
38 3
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
124 63
|
3天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
8 0
|
13天前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
32 7
|
14天前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
23 1
|
21天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
20天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
54 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解