斗罗世界中的C语言与数据结构:第四章

139 阅读4分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

斗罗世界中的C语言与数据结构:第四章

上一章,我们讲到了夕羽颜一路闯到了史莱克学院的第四关,接下来是最后一关,这是最难的一关,夕羽颜发挥得怎么样呢?让我们拭目以待吧!

下面是第一题:

image-20220326165508552

这道题目需要我们结合两个序列来绘树,首先看前序序列来确定第一个根节点。

然后因为前序遍历是BDGE而中序遍历是DGBE,所以我们能够得到左子树。而根据前序遍历CFH和中序遍历FHC我们能够得到右子树。

image-20220326165604777

接下来是第二题,这道题比较有意思,夕羽颜一看就知道这道题目他之前听父亲讲述过...

image-20220326165627365

第一题,答案是:

image-20220326165650422

回答这个问题需要我们了解开放地址法:

它只用数组一种数据结构存储,继承了数组的优点,对CPU缓冲友好,易于序列化。但是对内存的利用率并不如链表法,且冲突的代价更高。当数据量比较小、装载因子小的时候,适合采用开放寻址法。这也是Java中的ThreadLocalMap使用开放寻址法解决散列冲突的原因。

题目中22之所以放在散列位置为1的地方是因为需要22乘3然后模13得到的值是1。

而接下来的41乘3等于123,123模12得到6,所以它的散列位置为6。

以此方法,53的散列位置为3,46的散列位置是8,30的散列位置是12,13的散列位置是0。

此时需要注意了,1乘3模13应该是3,但是散列位置3已经被53使用了,所以往后推一个散列位置,其散列位置为4,67也是如此,散列位置6已经被占用了,所以它只能去散列位置7,51乘3模13得到10,所以其散列位置为10.

回答第二问,需要我们了解什么是装填因子:

装填因子等于关键字个数/表长。

所以此处装填因子为9/13=0.69

回答第三问,需要我们知道什么是平均查找长度:

查找成功的平均查找长度为:散列表中所有元素的查找次数之和/元素个数。

而查找失败的平均查找长度为:散列函数对应所有地址元素的查找次数之和/散列值。

所以此处:

平均查找长度为 (1+1+1+1+1+2+2+1+1)/9=11/9=1.22

再接下来是第三题,是关于最小堆的,夕雨颜马上去查找了有关最小堆的情况...

最小堆其实就是一棵完全二叉树,非叶子结点的值小于或等于其左孩子结点和右孩子结点的值。

同样的,最大堆也是一棵完全二叉树,非叶子结点的值大于或等于其左孩子结点和右孩子结点的值。

image-20220326165721640

第一问,就是要求会堆的调整。

image-20220326165739955

我们需要找到最后一个结点462,与908进行比较,然后908与462进行位置交换。第二次调整,是现在数字462的节点数组下标小1的节点为61,61与275和653进行比较。然后是下一个位置也就是512与170和897进行比较,将170与512进行位置交换。然后就是下一个位置87了,将87与275和462进行比较,不进行互换。然后就是503与170和87进行比较了,503与87进行互换。

然后继续从最后一个元素开始,462与908进行比较...

最后建立上图的最小堆。

第二问看似很容易,其实我们一眼就能看出来,但是我们得模拟计算机的工作,夕羽颜这样是这样回答的...

我们需要交换908与61的位置,然后进行调整...

908与87和170进行比较,然后908与87交换位置,908再和275与462进行比较,908与275交换位置,908再和503和653进行比较,908与503交换位置,最终得到如下:

image-20220326165758049

然后是本关最后一题出现了:

image-20220326165818143

我们前面介绍了B树以及B+树,此处就简单介绍一下:

image-20220326165841126

图片内容来源:B树B-树和B+树的总结 - 简书 www.jianshu.com/p/92d15df75…

这篇文章写得不错,可以作为补充阅读。

image-20220326165908500

image-20220326165931918

图片内容来源:B树B-树和B+树的总结 - 简书 www.jianshu.com/p/92d15df75…

这篇文章写得不错,可以作为补充阅读。