今天看啥  ›  专栏  ›  矮油不错哦_ab60

堆(heap)

矮油不错哦_ab60  · 简书  ·  · 2018-09-30 23:38

什么是堆??

……

优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。

问题:如何组织优先队列?

 一般的数组、链表?
 有序的数组或者链表?
 二叉搜索树? AVL树?

若采用数组或链表实现优先队列

 数组 :
插入 — 元素总是插入尾部 ~  ( 1 )
删除 — 查找最大(或最小)关键字 ~  ( n )
从数组中删去需要移动元素 ~ O( n )
 链表:
插入 — 元素总是插入链表的头部 ~  ( 1 )
删除 — 查找最大(或最小)关键字 ~  ( n )
删去结点 ~ ( 1 )
 有序数组:
插入 — 找到合适的位置 ~ O( n ) 或 O(log2 n )
移动元素并插入 ~ O( n )
删除 — 删去最后一个元素 ~ ( 1 )
 有序链表:
插入 — 找到合适的位置 ~ O( n )
插入元素 ~ ( 1 )
删除 — 删除首元素或最后元素 ~ ( 1 )

是否可以采用二叉树存储结构?

 二叉搜索树?
 如果采用二叉树结构,应更关注插入还是删除?
 树结点顺序怎么安排?
 树结构怎样?

堆的两个特性

结构性:用数组表示的完全二叉树;
有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
 “最大堆(MaxHeap)”
,也称“大顶堆”:最大值
 “最小堆(MinHeap)”
,也称“小顶堆” :最小值

最大堆的建立
方法1:通过插入操作,将N个元素一个个相继插入到一个初
始为空的堆中去,其时间代价最大为O(N logN)。
建立最大堆:将已经存在的N个元素按最大堆的要求存放在
一个一维数组中

方法2:在线性时间复杂度下建立最大堆。
(1)将N个元素按输入顺序存入,先满足完全二叉树的结构特性
(2)调整各结点位置,以满足最大堆的有序特性。




原文地址:访问原文地址
快照地址: 访问文章快照