软考知识点——数据结构:大顶堆与小顶堆、哈夫曼树

这篇具有很好参考价值的文章主要介绍了软考知识点——数据结构:大顶堆与小顶堆、哈夫曼树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、大顶堆与小顶堆

1.大顶堆与小顶堆的概念

2.大顶堆的构建

二、哈夫曼树

1.哈夫曼树的定义

2.基本概念

3.构造哈夫曼树

4.哈夫曼编码


一、大顶堆与小顶堆

1.大顶堆与小顶堆的概念

大顶堆:每个结点的值都大于或等于其左右孩子结点的值。

小顶堆:每个结点的值都小于或等于其左右孩子结点的值。

2.大顶堆的构建

以数组A=(2,8,7,1,3,5,6,4)为例,先根据数组,还原一棵二叉树。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

先找到最后一个非叶子结点,数组的长度为8,则最后一个非叶子结点是8/2-1=3,然后比较结点值和它的子树值,如果该结点小于其左/右子树的值,交换。

因为1小于它的左子树的值4,所以交换1和4。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

 继续找下一个非叶子结点,就是当前位置3(下标)减1,下标为2。

因为7大于左子树的值5,不交换。

继续找下一个非叶子结点,下标为1。

因为8大于左子树的值4,不交换。

继续找下一个非叶子结点,下标为0。

因为2不大于8也不大于7,所要重调,交换2和8。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

重新调整:从下标为3的非叶子结点开始,因为4大于它的左子树值1,不交换,

继续找下一个非叶子结点,当前位置3下标减1,下标为2。

因为7大于它的左子树值5和右子树值6,不交换,

继续找下一个非叶子结点,当前位置2下标减1,下标为1。

因为2不大于它的左子树值4,所以交换2和4。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

 继续找下一个非叶子结点,当前位置1下标减1,下标为0。

因为8大于它的左子树值4和右子树值7,不交换。

左右结点都满足大顶堆的性质,大顶堆建立完成。

数组A=(2,8,7,1,3,5,6,4)的大顶堆序列为8、4、7、2、3、5、6、1。

例题:(2021下半年上午真题60)

n个关键码构成的序列{k,k2, ...K,}当且仅当满足下列关系时称其为堆。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

以下关键码序列中,( ) 不是堆。

A、15,25,21,53,73,65,33

B、15,25,21,33,73,65,53

C、73,65,25,21,15,53,33

D、73,65,25,33,53,15,21

所属知识点:数据结构与算法基础>排序

答案解析:

本题考查堆排序的算法问题。

堆分为大顶堆(根节点大于左孩子和右孩子节点)和小顶堆(根节点小于左孩子节点和右孩子节点)。

根据选项来看,共7个节点,应该是3层的满二叉树,符合堆的有A,B,D三个选项。

仅有C选项73,65,25,21,15,53,33,73作为根节点,根大于其左孩子节点65和右孩子节点25都,是大顶堆的构造,第二层65作为左子树的根节点,大于了其左孩子节点21和右孩子节点15,符合大顶堆的构造;25作为右子树的根节点,却小于了其左孩子节点53和右孩子节点33,不符合大顶堆的构造了,故其不是堆。 

简洁解释:

A选项,根据数组,还原一棵二叉树如下,根结点全都小于左右子树,是小顶堆。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

B选项,根据数组,还原一棵二叉树如下,根结点全都小于左右子树,是小顶堆。

 大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

  C选项,根据数组,还原一棵二叉树如下,73和65符合大顶堆的构造,但25不符合。

 大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

 D选项,根据数组,还原一棵二叉树如下,根结点全都大于左右子树,是大顶堆。

 大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

二、哈夫曼树

1.哈夫曼树的定义

哈夫曼树也称最优二叉树,即给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。

2.基本概念

树的路径长度:从树根到每一个叶子结点之间的路径长度之和。

树的带权路径长度(WPL):所有叶子结点的带权路径长度之和。

3.构造哈夫曼树

将每个结点的权重按从小到大的顺序排队。

把两个最小的权重相加,并继续这一步骤,始终将较高的权重分支放在右边,直到加完所有结点的权重。

画出由根结点到每个叶子结点的路径,顺序记下沿路径的0和1,所得就是该符号的哈夫曼码字。

例子:有6个结点,权值分别为2,3,4,6,7,15,求树的带权路径长度,并画出构造的哈夫曼树。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

例题:

由权值为 29、12、15、6、23 的五个叶子结点构造的哈夫曼树为( ),其带权路径长度为( )。
(1)大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

 (2)A.85        B.188        C.192        D.222

所属知识点:数据结构与算法基础>树与二叉树的特性

答案解析:本题考查哈夫曼树。
构造最优二叉树的哈夫曼算法如下。
① 根据给定的n个权值{w1, w2,…,Wn}构成n棵二叉树的集合F= {T1.T2,…,Tn},其中每棵树T;中只有一个带权为w;的根结点,其左右子树均空。
② 在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,置新构造二叉树的根结点的权值为其左、右子树根结点的权值之和。
③从F中删除这两棵树,同时将新得到的二叉树加入到F中。
重复②、③,直到F中只含一棵树时为止。这棵树便是最优二叉树(哈夫曼树)。从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称为路径长度。树的路径长度是从树根到每一个结点的路径长度之和。树的带权路径长度为树中所有叶子结点的带权路径长度之和。

一般来说,这题的6和12应该换位,小的数放左边,大的数放右边。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师
因此,其带权路径长度(12+6)*3+15*2+23*2+29*2=188。 

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

 4.哈夫曼编码

通过哈夫曼树构造的编码。

例题1:(2021下半年上午真题64-65)

已知一个文件中出现的各字符及其对应的频率如下表所示。采用Huffman编码,则该文件中字符a和c的码长分别为(1)。若采用Huffman编码,则字序列 “110001001101” 的编码应为(2)。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

(1)A、1和3

B、1和4

C、3和3

D、3和4

(2)A、face

B、bace

C、acde

D、fade

所属知识点:数据结构与算法基础>最优二叉树(哈夫曼树)

答案解析:

本题考查哈夫曼树的构造问题。

根据题中表格字符构造出如下的哈夫曼树。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师

根据哈夫曼树可得:图中a的长度为1,c的长度为3。

第二空,a:0,b:101,c:100,d:111,e:1101,f:1100。

而对于字序列 “110001001101” 编码应该为face。

例题2:(2019下半年上午真题)

已知某文档包含5个字符,每个字符出现的频率如下表所示。采用霍夫曼编码对该文档压缩存储,则单词”cade“的编码为( ),文档的压缩比为( )。

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师
(1)A.1110110101        B.1100111101

C.1110110100        D.1100111100

(2)A.20%        B.25%        C.27%        D.30%

所属知识点:数据结构与算法基础>最优二叉树(哈夫曼树)

答案解析:解析1根据题干,可以先构造出如下哈夫曼树:

大顶堆,软件设计师,排序算法,算法,数据结构,哈夫曼树,软件设计师
对应c的编码111,a的编码0,d的编码110,e的编码101,第一空选择A选项。
压缩前,若要表示5个不同的字符,用二进制编码至少需要3位二进制,即每位字符占据空间3bit,平均字符长度为:
3×40%+3×10%+3×20%+3×16%+3×14%=3;
压缩后,这5个字符的编码长度分别为1、3、3、3、3,平均编码长度为:
1×40%+3×10%+3×20%+3×16%+3×14%=2.2;
压缩比为(3-2.2)/3=27%。文章来源地址https://www.toymoban.com/news/detail-741948.html

到了这里,关于软考知识点——数据结构:大顶堆与小顶堆、哈夫曼树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面试知识点(全)-数据结构和算法

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 数组 数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查

    2024年02月05日
    浏览(33)
  • 数据结构选择题练习知识点整理【3】

    n 个点连通且无环的简单无向图为连通图,连通则至少有n-1条边,无环则只有n-1条边。n个点连通且无环的简单无向图有n-1条边,非零个数为2(n-1),零元素个数为n^2-2(n-1)。得出零元素个数为n²-2n+2。 算术表达式 中缀、前缀、后缀的互相转换 中-前 从右到左 数字入栈,碰见运算

    2024年02月06日
    浏览(37)
  • 数据结构中一些零碎且易忘的知识点

    第一章 绪论 数据结构包含三个方面的内容: 数据的逻辑结构:描述数据之间逻辑关系的、与数据的存储无关的数学模型。相同的逻辑结构可使用不同的存储结构存储,如线性表既可顺序存储,也可链式存储 线性结构:一个线性表是n个具有相同特性的数据元素的有限序列 一

    2024年02月14日
    浏览(29)
  • 数据结构之双链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 双链表的实现  初始化双链表  在双链表中尾插数据  在双链表中尾删数据 在双链表中头插数据  在双链表中头删数据  在双链表中的指定位置之后插入

    2024年04月26日
    浏览(27)
  • 数据结构之单链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点  单链表中尾插数据  打印单链表中节点的数据  单链表中

    2024年04月15日
    浏览(26)
  • C#学习笔记--数据结构、泛型、委托事件等进阶知识点

    ArrayList 元素类型以Object类型存储,支持增删查改的数组容器。 因而存在装箱拆箱操作,谨慎使用。 ArrayList和数组区别? ArrayList使用不用说明固定长度,数组则需要 数组存储的是指定类型的,ArrayList是Object ArrayList存在装箱拆箱,数组不存在 ArrayList数组长度用Count获取 而数组

    2024年02月08日
    浏览(35)
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图

    本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。 此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术有限,最终数据清洗结果不够理想,

    2024年04月15日
    浏览(41)
  • 【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

    上一篇中我们进行了散列表的相关练习,在这一篇中我们要学习的是并查集。 在许多实际应用场景中,我们需要对元素进行分组,并且在这些分组中进行查询和修改操作。比如,在图论中,我们需要将节点按照连通性进行分组,以便进行最小生成树、最短路径等算法;在计算

    2024年02月03日
    浏览(41)
  • 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

      本篇博客 (上篇) 先带大家学习 递归方式 进行三种遍历, 而在后续的 (下篇) 中将为大家详细讲解非递归的三种遍历方式。 目录 1、二叉树 2、二叉树的递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历  二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

    2024年02月08日
    浏览(31)
  • 数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)

            前言:学习完了C语言的基础知识点之后,我们就需要使用我们所学的知识来进一步对存储在内存中的数据进行操作,这时候我们就需要学习数据结构。而这篇文章为数据结构中顺序表的讲解。 ✨✨✨ 这里是秋刀鱼不做梦的BLOG ✨✨✨ 想要了解更多内容可以访问我的

    2024年04月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包