有题目:
已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需要建堆,在此过程中,关键字之间的比较次数是( )。
A.1 B.2 C.3 D.4
我们需要了解什么是小根堆:
了解小根堆前,先要了解什么是堆?
堆
是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左子节点和右子节点的值。
小根堆
小根堆又叫最小堆、小顶堆,是二叉堆的形式之一。
每个节点的值都小于其左孩子和右孩子的值。其中,小根堆的根节点的值是整个堆中最小的,如下图:
常用于解决一些与优先级相关的问题,比如:
找到最小的K个元素
实现优先级队列
在插入和删除元素时具有较高的效率。
- 常见操作
- 插入元素
- 将新元素放在堆的最后
- 通过上浮操作将其调整到合适的位置
- 删除堆顶元素
- 将堆顶元素与最后一个元素交换
- 将堆的大小减一
- 通过下沉操作将堆顶元素调整到合适的位置
- 获取堆顶元素
大根堆
大根堆又叫最大堆、大顶堆,是二叉堆的形式之一。
每个节点的值都大于其左孩子和右孩子的值。其中,大根堆的根节点的值是整个堆中最大的,如下图:
回到题目:
已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需要建堆,在此过程中,关键字之间的比较次数是( )。
A.1 B.2 C.3 D.4
- 根据题目所讲,建立初始堆:
- 然后根据上面讲到的【删除堆顶元素的建堆操作】,总共3步:
- 将堆顶元素与最后一个元素交换
- 将堆的大小减一
- 通过下沉操作将堆顶元素调整到合适的位置
- 所以,
- 先将堆顶元素与最后一个元素交换:
- 然后将堆的大小减一,即删除8:
- 最后通过下沉操作将堆顶元素调整到合适的位置:
- 先设比较次数 j=0
- 将12与15进行比较,j+1=1,12比15小,不下沉,保持原样
- 将12与10进行比较,j+1=2,12比10大,执行下沉,12与10互换位置
- 下沉后,12再与16比较,j+1=3,12比16小,不下沉,保持原样
- 故结果为:
- 故比较次数为 j=3,总共3次,选C
- 先将堆顶元素与最后一个元素交换: