聊聊数据结构与算法:二叉堆

开发 前端
在一个包含 n 个数据的数组中,我们可以维护一个大小为 K 的小顶堆,顺序遍历数组,从数组中取出数 据与堆顶元素比较。如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中。

一、定义

二叉堆本质上是一种完全二叉树,它分为两个类型。

1. 大顶堆(最大堆)

最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值

2. 小顶堆(最小堆)

最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值

二叉堆的根节点叫作堆顶。

最大堆和最小堆的特点决定了:最大堆的堆顶是整个堆中的最大元素;最小堆的堆顶是整个堆中的最小元素

二、二叉堆存储

完全二叉树比较适合用数组来存储。用数组来存储完全二叉树是非常节省存储空间的。

因为我们不需要 存储左右子节点的指针,单纯地通过数组的下标,就可以找到一个节点的左右子节点和父节点。

从图中我们可以看到,数组中下标为 i 的节点的左子节点,就是下标为 i∗2 的节点,右子节点就是下标 为 i∗2+1 的节点,父节点就是下标为 i/2 取整的节点。

三、二叉堆的典型应用

优先队列

利用堆求 Top K问题

在一个包含 n 个数据的数组中,我们可以维护一个大小为 K 的小顶堆,顺序遍历数组,从数组中取出数 据与堆顶元素比较。如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中;如果比 堆顶元素小,则不做处理,继续遍历数组。这样等数组中的数据都遍历完之后,堆中的数据就是前 K 大 数据了

责任编辑:武晓燕 来源: 今日头条
相关推荐

2020-11-02 09:15:47

算法与数据结构

2021-04-01 10:34:18

Java编程数据结构算法

2021-03-29 10:13:47

Java编程数据结构算法

2021-03-19 10:25:12

Java数据结构算法

2021-03-22 09:00:22

Java数据结构算法

2020-11-23 08:53:34

堆Heap

2020-09-23 18:25:40

算法二叉树多叉树

2021-04-19 07:47:42

数据结构二叉树Tree

2021-04-20 08:37:14

数据结构二叉树

2022-09-05 08:06:49

数据结构Java

2013-01-30 10:34:02

数据结构

2020-08-31 07:43:58

二叉堆大顶堆存储

2021-04-28 20:12:27

数据结构创建

2021-01-07 08:12:47

数据结构二叉树

2021-05-06 05:29:32

二叉堆数据结构算法

2021-03-02 10:57:39

二叉树二叉堆节点

2020-10-21 14:57:04

数据结构算法图形

2023-03-08 08:03:09

数据结构算法归并排序

2023-10-27 07:04:20

2023-03-02 08:15:13

点赞
收藏

51CTO技术栈公众号