有10亿个浮点数,找出一万个最大的数

给一个基于最小二叉堆的方案:
第一阶段,向最小二叉堆中插入前一万个浮点数;
第二阶段,从第一万零一个浮点数开始,将之与最小二叉堆顶部的最小值比较。如果小于这个最小值,把最小值弹出并将新值插入到二叉堆中。重复此过程直到遍历完成。

. 创建长度一万的二叉树。
2. 遍历剩余的浮点数,若大于最小值则插入二叉树并删除最小的节点,否则略过。

这基本上是一个较优的算法,复杂度为: 千万级(一万的排序) + 140亿(插入二叉树)
从上面的粗略计算可以知道,二叉树的插入是最耗时的,因此如果能提前确定一个尽可能大初始数组则可能大大减少比较次数。
所以有必要对原始数据进行一些预算:
1. 将所有数据进行分组
2. 计算各组平均值
3. 对平均值排序
3. 以最大的做为初始数组,建立有序二叉树
4. 以平均值从大到小的顺序往初始二叉树中插入
这样就有可能避免很大比例的比较运算,当然对是否值得进行预算,以及预算到什么程度还需要根据原始数据的情况而定

1万个数快排.
剩下的数中取一个与之前数据中最小的比较.如果大于,做排入排序.直到取完剩余的数

使用链表

维护一个小到大排序的链表。每读一个就按大小插入到链表中相应位置。达到10000个后,每插入一个,就删除链表的第一个,小于第一个节点的数据忽略。

选择问题,nth_element (stl source code)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhongjiekangping/archive/2010/05/19/5607082.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值