heap,又称堆,在数据结构中,我们接触过最大堆max-heap,最小堆min-heap,这也都是heap,优先队列(priority queue)实际上也是heap来实现的。
Binary Heap是一种complete binary tree(完全二叉树),除了最底层叶子节点外,其他点都是满的,最底层叶子节点之间也不能有间隙,如下图就是一棵完全二叉树
将一棵完全二叉树映射成一个数组:
1.数组元素0作为一个标记位,不存实际的任何元素
2.对于处于数组下标 i 的元素,其左孩子(如果有的话),下标为2i;右孩子下标为2i + 1,父节点下标 [i/2]
所以用array就可以映射一个heap,因vector可动态扩展,所以用vector做底层存储会更合适一些。max-heap的最大值重总是在根基点,array的首元素;min-heap也类似。每次对heap的插入或pop都要调用一些算法(详见数据结构),保证操作之后,heap依然保持其特性。heap没有遍历功能,也不支持迭代器。
优先队列(priority queue)拥有权值的概念,它首先是一个queue,就需要满足底端入,顶端出的特性,但允许特定优先权的元素先出队列。
多数情况下优先队列是max-heap实现的,priority queue可以归为container adaptor。