P7【知识点】【数据结构】【堆heap】c++版

堆的概念:一种二叉树结构

  • 访问元素(Access)不支持
  • 搜索元素(Search)O(1)堆顶元素
  • 添加元素(Insert)O(logN)
  • 删除元素(delete)O(logN)

具体操作:

堆(Heap)通常不是通过标准库直接提供的特定数据结构,但通常我们指的是优先队列(std::priority_queue),它通常使用堆(特别是最大堆)来实现。此外,C++ STL(标准模板库)也提供了std::make_heapstd::push_heapstd::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个高频单词

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值