该std::priority_queue
模板提供了堆的所有属性。恒定时间最大或最小提取(取决于项目的比较方式)和对数时间插入。它可以在<queue>
头文件中找到。
默认情况下,priority_queue
是一个最大堆。
int numbers[11] = { 0, 9, 3, 4, 8, 12, 2, 11, 10, 1, 5 };
std::priority_queue<int> myheap(numbers, numbers + 11);
std::cout << "biggest " << myheap.top() << std::endl; // 12
myheap.pop();
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(6);
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(13);
std::cout << "biggest " << myheap.top() << std::endl; // 13
以下是如何创建最小堆的示例:
std::priority_queue<
int,
std::priority_queue<int>::container_type,
std::greater<int>
>;
要实现流式中位数算法,方法类似于:
- 为小于中位数的项目创建一个最大堆
- 为大于中位数的项目创建一个最小堆
- 将新项目推入堆时
- 决定应该将其推入哪个堆,然后将其推到那里
- 如果其中一个堆的大小比另一个堆大 1 以上,则弹出较大的堆,然后将该元素放入较小的堆中
然后,中位数是较大堆的顶部,或者是两个堆顶部的平均值。
如果您觉得需要手动管理堆,C++
请提供允许您在自己的随机访问数据结构上执行此操作的算法。
std::make_heap
-- heapify 迭代器端点指定的区域
std::push_heap
-- 假设前 N-1 个元素已经是一个堆,并将第 N 个元素合并到堆中
std::pop_heap
-- 将区域中的第一个元素放在最后一个位置,并重新堆集该区域,但不理会最后一个元素