堆的概念:一种二叉树结构
- 访问元素(Access)不支持
- 搜索元素(Search)O(1)堆顶元素
- 添加元素(Insert)O(logN)
- 删除元素(delete)O(logN)
具体操作:
堆(Heap)通常不是通过标准库直接提供的特定数据结构,但通常我们指的是优先队列(std::priority_queue
),它通常使用堆(特别是最大堆)来实现。此外,C++ STL(标准模板库)也提供了std::make_heap
、std::push_heap
、std::pop_heap
等函数来在任意数组或容器中模拟堆的行为。
1.创建堆:时间复杂度O(N)
std::vector<int> vec = {3, 1, 4};
// 将vec转换为最大堆
std::make_heap(vec.begin(), vec.end());
2.添加元素:时间复杂度O(logN)
// 向堆中添加元素
vec.push_back(2);
std::push_heap(vec.begin(), vec.end());
3.获取堆顶元素
// 获取堆顶元素(对于最大堆,是容器的第一个元素)
int top_element = vec.front();
std::cout << "堆顶元素: " << top_element << std::endl;
4.删除堆顶元素:时间复杂度O(logN)
// 弹出堆顶元素(即最大元素)
std::pop_heap(vec.begin(), vec.end());
vec.pop_back(); // 注意:pop_heap后需要手动删除最后一个元素
5.堆的长度
heap_size = vec.size();
std::cout << "弹出元素后堆的长度: " << heap_size << std::endl;
6.堆的遍历
for (const auto& x : vec) {
std::cout << x << " "; // 输出: 4 3 2
}
力扣练习:
【215】数组中第k个最大的元素
【692】前k个高频单词