注: 由于最小值和最大值的分析过程完全相同,这里我们只讨论最小值的分析流程,最大值同理

问题描述

每次给定一个数值,询问此数值以及之前给定数值中最小的n个数

例如给定数值的顺序为:8 7 1 2 9 4,设n == 3

  1. 8:不足3个数,则答案为8
  2. 7:不足3个数,则答案为8 7
  3. 1:不足3个数,则答案为8 7 1
  4. 28 7 1 2中较小的3个数为7 1 2
  5. 9: 8 7 1 2 9中较小的3个数为7 1 2
  6. 48 7 1 2 9 4中较小的3个数为4 1 2

暴力做法

一个最直观的方法是,每次添加新的数据后,将当前所有数据进行排序,选择较小的n个

一次排序最快也要\(O(nlogn)\),总的复杂度至少要\(O(n^2logn)\)

小根堆和大根堆

维护一个容量为n的大根堆,堆内元素代表当前最小的n个值

每次添加数值与堆顶元素进行比较,具有以下两种情况:

  • 大于堆顶元素: 由于是大根堆,堆顶元素为最小的n个数中的最大值,则此数值一定大于n个数中的其他值,即它一定不属于答案
  • 小于堆顶元素:则用它取代堆顶元素则可以使得这n个数更小

对于问题描述中所举的例子,使用大根堆的求解流程如下:

  1. 8:不足3个数,则答案为8
  2. 7:不足3个数,则答案为8 7
  3. 1:不足3个数,则答案为8 7 1
  4. 22 < 8, 则答案为7 2 1
  5. 9: 9 > 7,则答案不变为7 2 1
  6. 44 < 7,则答案为4 2 1

总结

动态求前n最小值使用大根堆

动态求前n最大值使用小根堆

动态求前n个最小值(最大值)的更多相关文章

  1. Jsの数组练习-求一组数中的最大值和最小值,以及所在位置

    要求:求一组数中的最大值和最小值,以及所在位置 代码实现: <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. BZOJ2006:超级钢琴(ST表+堆求前K大区间和)

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...

  3. 洛谷1440 求m区间的最小值 单调队列

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入格式: 第一行两个数n,m. 第 ...

  4. 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 堆排序 海量数据求前N大的值

    最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质. (2)父节点的键值(大于)小于等于子节点的键值 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2. ...

  6. 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 ...

  7. 两个序列求前k大和

    ---恢复内容开始--- 没有题目,没有题意,这是学长提过的一个技巧,给你两个排好序的序列,每次可以各从中取一个,求前k大的和, 一个优先队列,先将a序列中最大的那个和b序列所有元素相加存进队列中,每 ...

  8. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  9. 求前n项正整数的倒数和

    求前n项正整数的倒数和 前n项正整数的和是一个发散的序列,学过高等数学的这个都知道.所以它没有一个精确的公式,但是近似的公式是有的: 1 + 1/2 + 1/3 + …… + 1/n ≍ ln n + ...

  10. hdu 3641 数论 二分求符合条件的最小值数学杂题

    http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...

随机推荐

  1. 【BOOK】正则表达式

    正则表达式 1. 开源中国-正则表达式测试工具:https://tool.oschina.net/regex/ 2. 匹配规则 3. match() 从字符串起始位置匹配正则表达式 若从起始位置匹配不 ...

  2. OOP前三次作业总结

    一.前言 在开始OOP学习之前,我从未了解过什么是面向对象编程,想当然的认为OOP是像从前学习C一样的编程逻辑(即面向过程编程),但在真正开始学习OOP之后,我了解到了以往面向过程编程的局限性与不便利 ...

  3. HTML复习(18.图片样式)

    重点 掌握图片样式属性(大小.边框.对齐)了解float属性 图片大小在CSS中,我们也是使用width和height这2个属性来定义图片的大小(也就是宽度和高度).在实际开发中,如果你需要多大的图片 ...

  4. Redis API存取

    RedisClient redisClient = new RedisClient("127.0.0.1", 6379); [HttpGet] public int RedisIn ...

  5. libevent学习之入门--[02]从hello-world开始

    系列文章回顾 libevent学习之入门--[01]概述与安装 上一节介绍了libevent的下载和编译,从这节开始,我会从我学习的角度逐步探索libevent的源码,慢慢揭开它的神秘面纱. 面对几十 ...

  6. python机器学习——逻辑回归方法

    背景与原理: 线性回归可以实现对连续结果的预测,但是现实生活中我们常见的另一种问题是分类问题,尤其是二分类问题,在这种情况下使用线性回归就不太合适了,我们实际上需要计算出的是一个在$[0,1]$之间的 ...

  7. DAST精简代码

    先训练G:先不计算D的梯度: 判别器输入类型为(源域,0)或者(目标域,1),输出图片为真实图片(源域)的概率值for param in model_D.parameters(): # model_D ...

  8. Idea 配置 tomacat

    步骤 1.点击settings 2.创建tomcat 并找到tomcat的目录 添加完成 3.创建Idea项目

  9. ios MJRefresh 上拉死循环刷新问题+git 图片

    网上各种办法都试了,只有这种解决方法解决了我的问题,记录一下 通过延迟 1s后,再来请求接口 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...

  10. AIGC 至少能在两个方面改变当前的世界-纯银

    互联网圈一个正在形成的共识是,web3 只是金融领域的创新,还没有任何征兆能进入大众社会,但 AIGC 对世界的改变正在眼前发生.AIGC 至少能在两个方面改变当前的世界.1.对于缺乏创造力的(文字) ...