什么是堆??
……
优先队列(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)调整各结点位置,以满足最大堆的有序特性。