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

问题描述

每次给定一个数值,询问此数值以及之前给定数值中最小的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. Spectracom 默认口令

    网络空间搜索: FoFa 找到页面: 默认口令 在github上去找 登陆成功 End!!!

  2. phpmyadmin scripts/setup.php 反序列化漏洞(WooYun-2016-199433)(Kali)

    ​ phpmyadmin 2.x版本中存在一处反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行任意代码. 通过vulhub靶场进行复现操作 1.首先搭建靶场环境(采用Kali) cd vulhu ...

  3. PHP Redis - 事务

    Redis 事务可以一次执行多个命令, 并有两个重要的保证: ① 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. ② ...

  4. Optional类与使用==判断null有什么区别?使用Optional类有什么优势?

    1.使用object==null的例子 2.null带来的问题 3.其他语言中null的处理(替代) 4.Java8的Optional类 4.1 这样做有什么好处呢? 4.2 引入Optional类的 ...

  5. Linux deploy 32位系统 怎么安装宝塔怎么安装linux系统安装宝塔后搭建网站

    getconf LONG_BIT 获取当前linux系统位数

  6. 标记一下CF教育场的网址

    (因为太难翻了,做到哪里标到哪,自用 Educational Codeforces Round 1 Educational Codeforces Round 2 Educational Codefor ...

  7. 安装 TensorFlow 参考过的资料

    anaconda 的新环境创建 https://blog.csdn.net/yandajiangjun/article/details/102615912

  8. 安卓手机qpython使用感觉

    我是写C#的,最佳一时兴起,下载了个qpython来玩儿,发现这东西写点简单的爬虫还行,配合sqlite,可以做一些简单的事情,于是乎想写一个有趣的东西,在qpython写一个脚本,去收蚂蚁森林的能量 ...

  9. The Little Book of Rust Books

    https://lborb.github.io/book/title-page.html https://blog.logrocket.com/unsafe-rust-how-and-when-not ...

  10. Learning under Concept Drift: A Review 概念漂移综述论文阅读

    首先这是2018年一篇关于概念漂移综述的论文[1]. 最新的研究内容包括 (1)在非结构化和噪声数据集中怎么准确的检测概念漂移.how to accurately detect concept dri ...