介绍优先队列前我们先介绍两个基本概念:完全二叉树(Complete Binary Tree),满二叉树(Full Binary Tree)
满二叉树(Full Binary Tree)
A Full Binary Tree (FBT) is a tree in which every node other than the leaves has two children.
满二叉树要求一个节点有子节点则必须有两个
完全二叉树(Complete Binary Tree)
A Complete Binary Tree (CBT) is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.
上述定义明确告诉我们完全二叉树要求除了倒数第一层其它层全部满额,最后一层即使不满额也必须从左到右。对于完全二叉树我们可以很容易使用数组来进行表示:如果一个几点ID为N那么其子节点为2N+1和2N+2.如果知道该节点为N那么其父节点为N/2.
得到上述结论后我们再来看什么是优先队列。优先队列是STL提供的一种特殊Queue。其每次pop的值为该队列"最什么"的那个值,具体是什么个人可以自定义。优先对列最底层实际上采用了堆.堆要求父节点必须大于或者小于子节点,而不需要像BST一样要求右子树必须大于左子树。再加上数组实现所以正式实现方式很是简单。
1、插入
对于插入我们选择从数组的最末尾插入向上调整保证堆的特性不变。下图展示在原先Heap中插入15的操作过程。
2,删除
删除某个元素一般我们从末尾选择一个元素,先行占据删除位置在向下调整保证堆的特性不变。如下所示:
3、总结:
有时候我们需要在一堆数据中找出某几个最大或者最小的元素。一般的想法就是先排序。最快的排序也许需要O(nlogn)的复杂度。实际上这往往是一种浪费,因为我们把不需要排序的那部分数据也排序了。这时候采用优先队列往往是一个很不错的选择。