今天晚上的课我学到了啥OvO 2021.11.9

这篇博客探讨了一种使用堆排序算法解决寻找最小奶牛组合以达到书架高度的问题。作者首先介绍了堆的概念,包括小根堆和大根堆,并详细解释了如何找到节点的父亲和儿子。接着,讨论了堆的上浮和下沉操作,以及如何建立一个堆。博客以一个实际的编程挑战为背景,虽然没有给出完整的代码,但提供了关于堆排序的学习过程。
摘要由CSDN通过智能技术生成

 首先,这是洛谷的一道题。

让你来找用最少的奶牛来达到书架高度。

所以最好的就是先把奶牛按从高到低排序,然后从最高的开始累加,那样的话得到的数目一定是最少的。

所以问题就主要是在排序上,排序有很多种方法,这里可以用sort先给奶牛排序,但这样就太简单了,一行代码就排完序了。

但我今晚看题解 ,有一位大佬用手打堆,正好我就还没学到堆排,就学习了一下。

首先,我理解的堆其实就是一种特殊的数组。

在数组里面按特定的顺序排列给定的数字。

 

堆有两种:

那么我们怎么找到一个节点的父亲和儿子呢?

这是上图小根堆存在数组里的样子。

第二个点2的父亲是第一个点1,第二个点2的儿子为第四个点3与第五个点7。

得出结论:一个点的父亲为这个点的数组下表整除2;一个点的儿子为这个点的数组下标乘2或乘2加1.比如说节点2 的父亲节点就是2➗2=2,儿子节点就是2×2=4和2×2+1=5

堆中最重要的操作是上浮和下沉,正常的堆都是从小到大或从大到小。

但如果出现了如图的情况

这就破坏了堆的结构,就需要将他上浮或者下沉(这里是下沉,下沉比较麻烦)

首先我们要知道下沉是往更小的地方下沉,就比如这个图,666就应该往2下沉而不是8 ,

没下沉 一次,就交换一次下标,直到不能找到小于他的儿子节点。

上浮的话也是一个道理。

那么我们怎么建立一个堆呢?

加入给了你10个数字。 

这时候我们先建一个数组,每一个数字都插入队尾,然后下标加一再将下一个数字存入队尾。

这差不多就是这节课学到的??? 题还没做出来,做出来了等着再加上代码。🧐

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值