算法笔记
🐱堆/优先队列
00 min
Jul 2, 2021
Oct 28, 2023
type
status
date
slug
summary
tags
category
icon
password
很多的应用场景只需要取得当前数据集中最大或者最小的元素,而对于数据集中其它数据,并不关系

Priority Queue

优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。
优先队列 是一种抽象的数据类型,而  是一种数据结构。所以  是实现 优先队列 的一种方式。
实现 优先队列 的方式有很多种,比如数组和链表,而  能够使 优先队列 的插入、删除操作都在 的时间复杂度内完成,并且以 获得最大或者最小的元素

Heap

满足以下条件的二叉树,可以称之为 
  1. 完全二叉树;
  1. 每一个节点的值都必须 大于等于或者小于等于 其孩子节点的值。

插入操作

插入到末尾,然后上浮

删除操作

与末尾元素交换位置,然后不断下沉

实现

用静态数组存完全二叉树
💡
建立空堆,然后将元素一个个插入,时间复杂度为 但是直接将数组堆化,时间复杂度为(等差数列)
TODO:代码实现

C++

 
用到<algorithm>

堆排序

时间复杂度:
空间复杂度:

TopK问题

不用堆化全部元素的方法:
求前k大的元素,则维护一个大小为K的小根堆,遍历数组:
  • 如果堆不满,则直接插入;
  • 如果堆已满,则比较堆顶元素与当前元素,大于堆顶元素则删除堆顶元素同时将此元素插入;
直到遍历整个数组后,堆中的全部元素即为前k大的元素。

TopKth问题

上面问题最后结果的堆顶就是Kth

题目

Comments