在NSQ中,有两个最小堆实现的优先级队列,分别为: PriorityQueue,inFlightPqueue。分别用作延迟消息和消息的at least once机制。
堆排序(以大顶堆为例)
堆排序的基本操作:
- MAX-HEAPIFY : 运行时间为O(logn),是保持最大堆性质的关键。
- BUILD-MAX-HEAP:以线性时间运行,可以在无序的输入数组基础上构造出大顶堆。
- HEAP-SORT:运行时间为O(nlogn),对一个数组原地进行排序。
- MAX-HEAP-INSER,HEAP-INCREASE-KEY, 运行时间均为O(logn),可以让堆结构作为优先队列使用。
MAX-HEAPIFY
堆调整是一个自顶向下的过程。
1 |
|
BUILD-MAX-HEAP
建立一个堆,是一个自底向上的过程。
1 |
|
HEAP-SORT
最开始利用BUILD-MAX-HEAP将输入数组构造成一个大顶堆。每次将根节点与A[n]互换来达到最终正确的位置。同时缩小堆的大小。
新的根元素可能违背了最大堆的性质,这时通过MAX-HEAPIFY来进行调整,保持这一性质。不断重复此过程,直到堆的大小降到2。
1 |
|
HEAP-INCREASE-KEY
首先将i位置的元素更新为key。由于A[i]的增大可能会违反最大堆的性质。所以在过程中采用了向上调整的方法。
1 |
|
MAX-HEAP-INSERT
向堆中插入元素。
1 | MAX-HEAP-INSERT(A, key) |
InFlightPqueue源码解析
可以将下面源码和上面堆排序的基本操作结合起来看。
1 |
|