算法知识-堆相关知识

一.对顶堆

1.作用

可以动态维护一个序列上第 k 大的数,k 值会发生变化。比写 线段树 或 BST 简单。

2.算法思想

对顶堆由一个大根堆与一个小根堆组成,小根堆维护前 k 大的数(包含第 k 个,小根堆装大的数),大根堆维护比第 k 大数小的数(大根堆装小的数)

  1. 插入:若插入的元素 ≥ 小根堆堆顶元素,则将其插入小根堆,否则将其插入大根堆。
  2. 维护:当小根堆的大小 > k 时,不断将小根堆堆顶元素取出并插入大根堆,直到小根堆的大小等于 k;
    当小根堆的大小 < k 时,不断将大根堆堆顶元素取出并插入小根堆,直到小根堆的大小等于 k。
  3. 查询第 k 大元素:小根堆堆顶元素。
  4. 删除第 k 大元素:删除小根堆堆顶元素。

D - Chalkboard Median

题意:给你一个数x,之后每次固定向里面加入两个数字,之后每次求这个序列的中位数

解题思路:

这是动态求第k大的问题,我们使用对顶堆

cpp 复制代码
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
class DuiDing {
private:
    // 大根堆:存较小的那一半数
    priority_queue<int> big;
    // 小根堆:存较大的那一半数(前 k 大)
    priority_queue<int, vector<int>, greater<int>> small;

public:
    // 插入单个元素
    void insert(int x, int k) {
        // 1. 决定放入哪个堆
        // 注意:如果 small 为空,或者 x 比 small 的堆顶大(或相等),放入 small
        if (small.empty() || x >= small.top()) {
            small.push(x);
        }
        else {
            big.push(x);
        }

        // 2. 平衡两个堆的大小
        // 情况 A: small 里的数太多了(超过了 k 个),把最小的移给 big
        while (small.size() > k) {
            big.push(small.top());
            small.pop();
        }

        // 情况 B: small 里的数太少了(不足 k 个),且 big 里有货,把最大的移给 small
        //  判断,防止空指针异常
        while (small.size() < k && !big.empty()) {
            small.push(big.top());
            big.pop();
        }
    }

    // 获取第 k 大
    // 增加了一个安全检查,防止在元素不足 k 个时访问空堆
    int get_k() {
        if (small.empty()) return -1; // 或者抛出异常
        return small.top();
    }
};

int main() {
	int x; cin >> x;
	int q; cin >> q;
	DuiDing d;
	
	int cnt = 1;
    d.insert(x, 1);
    while (q--) {
		vector<int>num(2);
        int a, b; cin >> a >> b;
		d.insert(a, ++cnt);
        d.insert(b, cnt);
		cout << d.get_k()<<'\n';
	}

	return 0;
}
相关推荐
汉克老师18 分钟前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
lulu121654407835 分钟前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI40 分钟前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
林间码客1 小时前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe1 小时前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
IronMurphy1 小时前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息1 小时前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真
(Charon)1 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
月疯1 小时前
PPG研究中暑的算法记录
算法