查找之找出N个整数中最大的K个数

工程师如何用系统化思维构建稳健投资框架:从需求分析到自动化执行 在软件工程中,系统化思维和模块化设计是构建稳定、可维护应用的核心。这些理念同样适用于个人投资领域,通过将技术项目管理的方法论迁移到资产管理中,可以建立一套逻辑清晰、风险可控的决策框架。其技术价值在于将模糊的投资决策转化为可量化、可验证的工程流程,从而规避情绪化操作和认知偏差。具体应用时,可以从定义清晰的“投资需求规格说明书”入手,明确目标、约束和成功标准,这类似于软件项目的需求分析阶段。接着进行“技术选型”,即资产配置,将现金、债券、股票、指数基金等不同资产类别类比为不同的技术栈组件,根据风险收益特征进行组 阅读详情

题目一:找出N个整数中第K大的数

类似下边的类快排算法,递归实现,应该可以,需要验证一下。平均复杂度O(n).



题目二:找出N个整数中最大的K个数

两个比较好的解法:O(nlogk)

1快排和递归

【解法二】

回忆一下快速排序,快排中的每一步,都是将待排数据分做两组,其中一组
的数据的任何一个数都比另一组中的任何一个大,然后再对两组分别做类似的操
作,然后继续下去……

在本问题中,假设 N 个数存储在数组 S 中,我们从数组 S 中随机找出一个
元素 X,把数组分为两部分 Sa 和 Sb。Sa 中的元素大于等于 X,Sb 中元素小于 X。

这时,有两种可能性:

1. Sa中元素的个数小于K,Sa中所有的数和Sb中最大的K-|Sa|个元素(|Sa|指Sa

中元素的个数)就是数组S中最大的K个数。

2. Sa中元素的个数大于或等于K,则需要返回Sa中最大的K个元素。

这样递归下去,不断把问题分解成更小的问题,平均时间复杂度 O(N *
log2K)。伪代码如下:

Kbig(S, k):
if(k <= 0):
return [ ] // 返回空数组

if(length S <= k):
return S
(Sa, Sb) = Partition(S)
return Kbig(Sa, k).Append(Kbig(Sb, k – length Sa)

Partition(S):

Sa = [] // 初始化为空数组

Sb = []
// 随机选择一个数作为分组标准,以避免特殊数据下的算法退化
// 也可以通过对整个数据进行洗牌预处理实现这个目的
// Swap(S[1], S[Random() % length S])
p = S[1]
for i in [2: length S]:
S[i] > p ? Sa.Append(S[i]) : Sb.Append(S[i])
// 将p加入较小的组, 可以避免分组失败, 也使分组更均匀,提高效率
length Sa < length Sb ? Sa.Append(p) : Sb.Append(p)
return (Sa, Sb)

2 堆排序

不妨设 N > K,前 K 个数中的最大 K 个数是一个退化的情况,所有 K 个数
就是最大的 K 个数。如果考虑第 K+1 个数 X 呢?如果 X 比最大的 K 个数中的最
小的数 Y 小,那么最大的 K 个数还是保持不变。如果 X 比 Y 大,那么最大的 K
个数应该去掉 Y,而包含 X。如果用一个数组来存储最大的 K 个数,每新加入一
个数 X,就扫描一遍数组,得到数组中最小的数 Y。用 X 替代 Y,或者保持原数
组不变。这样的方法,所耗费的时间为 O(N * K)。

进一步,可以用容量为 K 的最小堆来存储最大的 K 个数。最小堆的堆顶元
素就是最大 K 个数中最小的一个。每次新考虑一个数 X,如果 X 比堆顶的元素
Y 小,则不需要改变原来的堆,因为这个元素比最大的 K 个数小。如果 X 比堆
顶元素大,那么用 X 替换堆顶的元素 Y。在 X 替换堆顶元素 Y 之后,X 可能破
坏最小堆的结构(每个结点都比它的父亲结点大),需要更新堆来维持堆的性
质。更新过程花费的时间复杂度为 O(log2K)。



 编程之美

图 2-1 是一个堆,用一个数组 h[]表示。每个元素 h[i],它的父亲结点是 h[i/2],
儿子结点是 h[2 * i + 1]和 h[2 * i + 2]。每新考虑一个数 X,需要进行的更新操作伪
代码如下:

if(X > h[0])
{
h[0] = X;
p = 0;
while(p < K)
{
q = 2 * p + 1;
if(q >= K)
break;
if((q < K-1) && (h[q + 1] < h[q]))
q = q + 1;
if(h[q] < h[p])
{
t = h[p];
h[p] = h[q];
h[q] = t;
p = q;
}
else
break;
}
}

原帖: http://blog.youkuaiyun.com/scottgly/article/details/6958227
N个数里面找出最大的k个数 题目:给出N个无序的数,然后找出其中最大的k个数 解题思路:          首先测试数据有可能会有一亿个数,数据量特别的大,数据库不可能存储这么多的数据。如果直接sort排序,NlogN时间复杂度实在是太高,大于10^9。我们可以考虑对数据进行分块读取,每次读取的数据块大小应大于k。          不如先假设第一次读取的数据块前k个数最大,然后把k个数建成最小二叉堆。然后从第k+1个 阅读详情

相关推荐

从N个整数中选择K个数

一、问题 给定N个整数(可能有负数),从中选择K个数,使得这K个数之和恰好等于一个给定的整数X; 如果有多种方案,选择它们中元素平方和最大的一个。数据保证这样的方案唯一。 例如,从4个整数{2,3,3,4}中选择2个数,使它们的和为6,显然有两种方案{2,4}与{3,3},其中平方和最大的方案为{2,4}。 二、算法实现 //从n个数中选k个数使得和为x //若有多个方案选...

Curtis’Blog 2958

面试题:从n个数中找出第K大的数

参考https://blog.youkuaiyun.com/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1:基于冒泡排序和简单选择排序,时间复杂度o(n*k) 我们知道,在冒泡排序和简单选择排序中,最外层的循环每遍历一次,都可以把第i大(或第i小)的数排到数组的最前面,所以我们用这种方法,最外面经过k次遍历之后,就可以...

orangefly0214的博客 5万+

堆排序-在n个数中找出K个最大的数

在n个数中找出K个最大的数 主要思想:在n个数中找k个最大(小)的数,肯定要用到最小堆、最大堆的思想,而这种思想在C中STL中的优先队列(priority_queue)中体现比较明显,优先队列底层实现就是运用了最大堆、最小堆原理,如果要求用c实现的话,可以直接用。如果用C语言实现的话,就需要自己定于堆的一系列操作,自己实现最大堆、最小堆。 实现一:C++实现 直接调用STL中的priorit...

qq_20110551的博客 2952

经典算法题:寻找数组中第k大的元素

这算是一道相当经典的算法题了:在长度为N的乱序数组中寻找第k(n&gt;=k)大的元素。扩展思考:如何处理数组中的重复元素?比如,对于数组a={1,2,2,2,3,3,3},第二大的元素应该是3还是2呢?本文作这种分类:如果第二大的元素是3,说明在处理第k大的元素时不处理重复的数据,也就是将原数组进行降序排序后,下标为k-1的元素。这种处理方法称之为“不处理重复数据方法”;如果第二大的元素是2,说...

凛冬烈焰的博客 2万+

海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)

一、问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。 复杂度分析 建堆时间复杂度是O(m),堆调整的时间复杂度是O(logm),最终时间复杂度等于,1次建堆时间+n次堆调整时间=O(m+nlogm)=O(nlogm) 这里的n为10亿,m为100

寒泉 7万+

从N个数中选最小的K个数

<br /> <br /> <br /> <br />声明:题目来自: http://blog.youkuaiyun.com/v_JULY_v/archive/2010/11/17/6015165.aspx  JULY整理了100道微软等公司的面试题目,我想先不看答案:http://blog.youkuaiyun.com/v_JULY_v/archive/2011/01/10/6126406.aspx 自己先做一遍。<br /> <br />题目:<br /><br />5. 查找最小的k 个元素<br />题目:输入

arrow_pig的专栏 2567

面试题精选:寻找最大的K个数

给你n个数,让你找出其中最大的K个数。 解法1: 很多人上来就对其进行排序,选用不同的排序方法有不同的时间复杂度,这里我们假设使用了最快的快排,时间复杂度为O(n*logn)。通过排序我摘出前K大的数。 但也许快排不是最优的,我们只找最大的K个数,何必要对所有的数进行排序,我们只需要进行局部排序即可,时间复杂度大概是O(N*K)。 但快排和局部排序谁优谁劣是并不是一定的,当

xindoo 2359

从学生项目到工程实践:手把手教你用ATE测试电源芯片的Rdson与漏电流

本文详细介绍了如何将学术级的电源芯片测试方案转化为工业级解决方案,重点讲解使用ATE设备测试Rdson(导通电阻)和漏电流的关键技术。从设备选型、测试夹具设计到量产环境下的工程化实现,提供了实用的优化技巧和常见问题解决方案,帮助工程师提升测试效率和精度。

weixin_42525289的博客 180

找出N个整数中最大的K个数

问题:在N个数据中查找到第k个大的值。 原文地址 所谓“第(前)k大数问题”指的是在长度为n(n&gt;=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 解法1:我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。   解法2:利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k) ...

weixin_34290000的博客 317

车底盘:阿克曼转向和四轮差速

特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。

bing_feilong的博客 1918

Unity与IOS交互,调用IOS系统相机和相册

与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。

Hello Mingo 1万+

Interview100-5 查找数组中最小的K个元素

题目 输入n个整数,输出其中最小的k个数。例如,输入:[1,2,3,4,5,6,7,8],其中最小的4个数为:[1,2,3,4]。 解法 这个题目应该有很多种不同的思路和解法: 1. 快速排序后输入前k个元素。首先想到快速排序是因为它在比较排序种的时间复杂度很低而且为原址排序不像归并排序那样需要辅助空间。快速排序的时间复杂度为:O(nlgn),因此这种方式的时间复杂度也就是:O(nlgn)...

Blossom 312

数字IC/FPGA 秋招知识点不全面整理

数字IC/FPGA 秋招知识点不全面整理

w0shishabi的博客 7866

程序员面试题精选(05)-查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。 我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,...

wdp107 377

(6)APB总线协议 —— 逻辑梳理(0.1认知)

这篇大家就差不多看看就行

CAUC_learner的博客 2702

YOLOv8科研探索:HAttention激活更多特征点,真心助你提升细粒度检测精度

如果你在集成中遇到问题,不妨从特征点激活阈值、多尺度融合的逻辑入手,一点点打磨——科研的突破,往往就藏在这些细致的尝试里。想象一下,普通模型可能只关注目标的“大块区域”,而HAttention能让模型同时捕捉到目标的“边缘”“纹理”等细粒度特征点,就像给模型装上了“显微镜”,再小的细节也逃不过它的“眼睛”。比如,小目标的细粒度特征点(如昆虫的触角)和大目标的整体特征点(如昆虫的身体)会被同时考虑,通过注意力权重的分配,让小细节融入全局理解,避免模型“只见树木不见森林”。HAttention通过。

FJN110的博客 78

剑指offer | 最小的K个数

最小的K个数 描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 代码 import java.util.ArrayList; import java.util.Random; public class Solution { public ArrayList<Integer> GetLeastNumbe...

Karmen199x的博客 171

EMC基础知识总结

电磁干扰(Electromagnetic Interference),简称EMI,有和两种。传导干扰主要是电子设备产生的干扰信号通过导电介质或公共电源线互相产生干扰;辐射干扰是指电子设备产生的干扰信号通过空间耦合把干扰信号传给另一个电网络或电子设备。

学海无涯的专栏 1363

n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(n logk)

这个问题好多人使用了最大堆的排序方式,因为我对最大堆不是很了解所以使用了数组。 基本思路是,1:申请一个k大小的辅助数组,然后取数组中的个值赋值给辅助数组,为了方便,取了数组的前k个数字赋给辅助数组。 2:对辅助数组进行排序,从小到达排列。 3:用数组中的数字分别和辅助数组的最大值进行比较,如果小于辅助数组的最大值则,辅助数组中的最大值替换,之后对辅助数组进行排序。下面的过程就是不断的用数组

aini201的专栏 3760

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

找出N个元素的数组中最大的K个数

题目: 给出 N 个整数(N可能很大,以致无法装入内存),找出前 K 个最大的整数 【解法一】 如果 N 的数量不是很大,例如在几千个左右,则在这种情况下,那我们就先排序一下,这里快速排序或者推排序都是很好的解决方案,平均时间复杂度为 O(N * log2N)。然后取出前 K 个,O(K)。 总共时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。 当 K =

shuiziliu1025的博客 7346

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

27 最小的k个数: 输入n个整数,找出其中最小的k个数。

一、题目 输入n个整数,找出其中最小的k个数。 例子说明: 例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 解法一:O(n)时间算法,只有可以修改输入数组时可用。 可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于...

皮卡丘的博客 3321

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

输入n个整数,找出最小的k个数

题目描述:输入n个整数,找出其中最小的K个数 例如输入4,5,6,1,2,3,7,8这8个数字 则最小的4个数字是1,2,3,4 方法一:对数组进行排序 时间复杂度O(nlogn) import java.util.ArrayList; import java.util.Arrays; public class GetLeastNumbers { public static Ar...

qq_44929652的博客 1919
上一篇: 字符串之字符串左旋
下一篇: 离散数学之鸽巢原理
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值