动态求前n个最小值(最大值)
注: 由于最小值和最大值的分析过程完全相同,这里我们只讨论最小值的分析流程,最大值同理
问题描述
每次给定一个数值,询问此数值以及之前给定数值中最小的n个数
例如给定数值的顺序为:8 7 1 2 9 4,设n == 3
8:不足3个数,则答案为87:不足3个数,则答案为8 71:不足3个数,则答案为8 7 12:8 7 1 2中较小的3个数为7 1 29:8 7 1 2 9中较小的3个数为7 1 24:8 7 1 2 9 4中较小的3个数为4 1 2
暴力做法
一个最直观的方法是,每次添加新的数据后,将当前所有数据进行排序,选择较小的n个
一次排序最快也要\(O(nlogn)\),总的复杂度至少要\(O(n^2logn)\)
小根堆和大根堆
维护一个容量为n的大根堆,堆内元素代表当前最小的n个值
每次添加数值与堆顶元素进行比较,具有以下两种情况:
- 大于堆顶元素: 由于是大根堆,堆顶元素为最小的
n个数中的最大值,则此数值一定大于n个数中的其他值,即它一定不属于答案 - 小于堆顶元素:则用它取代堆顶元素则可以使得这
n个数更小
对于问题描述中所举的例子,使用大根堆的求解流程如下:
8:不足3个数,则答案为87:不足3个数,则答案为8 71:不足3个数,则答案为8 7 12:2 < 8, 则答案为7 2 19:9 > 7,则答案不变为7 2 14:4 < 7,则答案为4 2 1
总结
动态求前n个最小值使用大根堆
动态求前n个最大值使用小根堆
动态求前n个最小值(最大值)的更多相关文章
- Jsの数组练习-求一组数中的最大值和最小值,以及所在位置
要求:求一组数中的最大值和最小值,以及所在位置 代码实现: <!DOCTYPE html> <html lang="en"> <head> &l ...
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- 洛谷1440 求m区间的最小值 单调队列
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入格式: 第一行两个数n,m. 第 ...
- 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 堆排序 海量数据求前N大的值
最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质. (2)父节点的键值(大于)小于等于子节点的键值 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2. ...
- poj 2752 Seek the Name, Seek the Fame【KMP算法分析记录】【求前后缀相同的子串的长度】
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14106 Ac ...
- 两个序列求前k大和
---恢复内容开始--- 没有题目,没有题意,这是学长提过的一个技巧,给你两个排好序的序列,每次可以各从中取一个,求前k大的和, 一个优先队列,先将a序列中最大的那个和b序列所有元素相加存进队列中,每 ...
- 利用快排partition求前N小的元素
求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...
- 求前n项正整数的倒数和
求前n项正整数的倒数和 前n项正整数的和是一个发散的序列,学过高等数学的这个都知道.所以它没有一个精确的公式,但是近似的公式是有的: 1 + 1/2 + 1/3 + …… + 1/n ≍ ln n + ...
- hdu 3641 数论 二分求符合条件的最小值数学杂题
http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...
随机推荐
- docker-io安装报错
一般修改两个文件即可 1.文件 :/etc/docker/daemon.json { "storage-driver": "devicemapper" } 2. ...
- centos安装docker显示 No package docker-ce available
温馨提醒,docker内核版本必须是3.10+以上的版本 查看方式 uname -r 1. 卸载老版本的 docker 及其相关依赖 sudo yum remove docker docker-com ...
- vue 同一个子组件,两次赋值不同,dom不更新
转自:https://blog.csdn.net/WO_JIAMIFENG/article/details/115250918 <div :key="inputkey"> ...
- 网易面经-hashmap是否能存null(debug源码)
面试时一定要坚持自己的认知,不要让面试官两三下pua了. 结果是可以的 null作为key时被放在了tab下标为0的位置,只能有一个null null作为value时不受限制 虽然说value为nul ...
- 2003031120—廖威—Python数据分析第七周作业—MySQL的安装以及使用
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/pexy/20sj 这个作业要求链接 https://edu.cnblogs.com/campus/ ...
- Python测试——安装篇总结
测试用到的工具自己知道的有: 写脚本类:sublime ,PyCharm,Eclipse+PyDev,目前我知道的只有这么多,大家知道的肯定还有很多,欢迎留言哈 录制脚本类:火狐自带的seleniu ...
- Oracle账户被锁住,解锁
转载自:https://blog.csdn.net/weixin_43464743/article/details/121226334 方法一PLSQL解锁1.用dba用户登录plsql.2.左侧选择 ...
- Spring 笔记三 事务
一.环境搭建 [1]导包 [2]编写配置文件 1. 配置扫描注解 2. 引入外部资源文件 3. 配置数据源 4. 配置JdbcTemplate 操作数据库 5. 配置声明式事务 5.1 Spring ...
- Q:windows系统如何开机启动批处理脚本
方法1 1.win+r输入gpedit.msc进入本地策略管理器 2.点击windows设置下的脚本(启动/关机),然后双击启动. 3.点击添加,然后点击浏览,选择批处理文件然后点击确定. 方法2 也 ...
- promise一脸懵逼...
// 要求:封装一个方法,能根据路径读取文件,并把内容返回 const fs=require('fs') const path=require('path') 1. 普通读取文件的方式 1 const ...