STL源码剖析-heap
1.heap产生背景:
heap作为priority queue底层机制。priority queue 允许用户以任意次序将任何元素推入容器内,但是取出时一定是从优先级最高的元素开始取。
priority queue功能:1.频繁的插入和删除元素。2.频繁的寻找元素的极值。根据这两个功能初步选择list,但是list针对于极值的情况会导致O(n)的时间复杂度,故丢弃本想法。当选择二叉搜索树的时候,但是RB_tree实现过于复杂并且在插入元素的时候又需要随机。故binary heap产生了。
binary heap 是一种完全二叉树。
2.heap底层结构:
1.选择一个vector和heap算法进行binary heap的搭建。heap算法的作用是:插入元素,删除元素,取极值,将某一组数据排列成一个heap。
2.实现的算法是:一个完全二叉树的性质:完全二叉树中的某一个节点位于array的i处时,其左子节点必位于array的2i处,其右子节点必位于array2i+1处,其父节点必位于i/2处。
3.heap种类:分为max-heap和min-heap
	max-heap:节点的键值都大于或者等于子节点键值
	min-heap:节点的键值都小于或者等于子节点键值
3.heap算法
push_heap算法
算法思想:
	1.先将新加入的元素一定要放在最下一层作为叶子节点,并填补在由左至右的第一个空格。
	2.根据新添加的元素判断是否适用于现在的位置,假如不适用,则执行上溯程序:将新节点拿来于其父节点进行比较,如果其键值必父节点大,就父子对换位置。如此一直上溯,直到不需对换或者直到根节点为止。
pop_heap算法
算法思想:
	1.先将尾部节点保存下来,并将其赋值为根节点,此时根节点为空洞节点。
	2.将交换完的空洞节点和其较大子节点“对调”,并持续下放,直到叶子节点为止。
	3.将最下层和最右层叶子节点割舍掉(此时尾部节点就是最大的节点,采用vector的back获取其值,pop_back弹出其值)。
	4.再执行一次上溯程序。这个必须有
sort_heap算法
算法思想:
	每次pop_heap可获得heap中键值最大的元素,如果持续对整个heap做pop_heap操作,每次将操作范围从后向前缩减一个元素,当整个程序执行完毕之后,就出现了一个递增序列。
make_heap算法
算法思想:
	1.一个完全二叉树的性质:完全二叉树中的某一个节点位于array的i处时,其左子节点必位于array的2i处,其右子节点必位于array2i+1处,其父节点必位于i/2处。
	2.再进行_adjust_heap进行调整。