在前面分析了二叉搜索树
、红黑树
等众多树结构
,今天博主给大家换个口味,深入分析一下堆
的实现原理与维护规则。(堆
其实与二叉树
有点相似)
数据结构之堆原理分析目录
一、堆
的概述
1、什么是堆
堆
,在日常生活中是一个量词,比如:一堆木头
,下面这张图就是一堆木头
,大家注意它的摆放规则,成金字塔型
(上窄下宽)。
数据结构中的堆
,与上面的结构类似,不过借助了二叉树
的结构。肯定会有小伙伴来一句,woc,这不就是二叉树
么。。。其实你也可以暂时这么理解,看完博客你就会发现还是有些区别。
2、堆
的划分
根据堆
中元素摆放顺序的不同,可分为两种堆结构,小顶堆
、大顶堆
。
小顶堆
:对于堆中的任意节点A
,如果它存在子节点B、C,则 节点A
的值 ≤ min{
子节点B
的值, 子节点C
的值}
大顶堆
:对于堆中的任意节点A
,如果它存在子节点B、C,则 节点A
的值 ≥ max{
子节点B
的值, 子节点C
的值}
注 意 : \color{red}注意: 注意:堆只对父节点
的值与子节点
的值有大小限定,但是对于节点
的左、右子节点
的值相对关系没有限定(二叉搜索树
的特征才是 左子节点
< 父
< 右子节点
)。
3、堆
的作用
讲了半天,也画了好几张图,辣么堆
有什么作用呢?
根据前面小顶堆
、大顶堆
的定义,我们知道小顶堆
的堆顶
存放的是堆中最小
的元素,大顶堆
的堆顶
存放的堆中最大
的元素。而这正是堆
的作用,可能会有小伙伴一脸鄙夷,就这找最值的功能都要特意设计一个数据结构
来实现?
那来一道面试题,给你10亿
个数,如何在最短的时间里找出最大的10
个? (我觉得如果没做出这道题,辣么只能说了解堆的定义,但是不理解、不会运用堆
,边看博客,边思考吧,文末附答案)
二、堆
的底层实现
堆
的实现一般使用数组
,而不是二叉树</