关于在大量数据n个中取前k个数据的一点记录

之前面试的时候硬是想不起来,面试官提醒之后才想起来自己也接触到过这样的题目。

一般都是用的堆排序,建立大小为k的大顶堆,使用前k个数直接建堆,则对顶是最大数,再使用第k+i(i=1,2,3...)个数去和堆顶做比较,小于则替换堆顶,再进行沉降,大于则跳过。这样就可以始终保持此k大小的堆为前k个数。

复杂度应该是nlogk。

 

 

今天看到算法笔记中提到使用快排也可以。

思想是选中合适基准将数据分为两段,两段大小分别为x,y,x>k时,直接抛弃第二段,否则再将第二段y大小的数据选基准分割,分割分别为y1,y2,再将y1和k-x进行比较,y1>k-x时抛弃后半段,否则在进行上面的操作...

递归的思想不断分割出k大小的数据段(累计为k),平均复杂度应该也是nlogk。取决于随机选中的基准大小了...

只是一点思想,想起来了便写下来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值