有10亿个浮点数,从中找出1万个最大的数。写一个高性能的算法

mikemeego001 2011-06-02 08:47:00
rtt

...全文
345 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
giveable-coding 2011-06-03
  • 打赏
  • 举报
回复
其实真正用堆来做内存的使用量和堆的大小有关,1万个浮点数的内存也就在1MB左右,用小根堆来选择top k是没问题的。
giveable-coding 2011-06-03
  • 打赏
  • 举报
回复
“有10亿个浮点数,从中找出1万个最大的数。写一个高性能的算法”
这个题目是从10亿个中找出1万个最大的,如果这10亿个数里面有很多重复的数,我觉得应该先用hash,把这10亿个数字“去重”,这样如果重复率很高的话,会减少很大的内存用量,10亿个浮点数的内存不大于1GB,如果重复率很大,可能内存会降到0.5GB左右;如果不重复,那就直接使用堆来选择,然后再用一个维护1万个元素的“小根堆”进行筛选,将数据一次读入堆,因为小根堆,所以堆顶始终是1万个大数中的最小的,将要读的数与堆顶元素比较,如果大,进堆,否则什么不做,读下一个数字,最后这个小根堆中就维护了一个1万个最大的数字。
giveable-coding 2011-06-03
  • 打赏
  • 举报
回复
就是将不同的浮点数作为key,带入到一个合适的hash函数里,然后算出存储地址,放进去,每个散列存储单元里存一个结构体吧,数据域存这个浮点数,次数域存出现的次数,比如1.234存了进去,当在次出现1.234时就将次数域加1,就可以了吧,这样就不用重复的空间去存储了
luciferisnotsatan 2011-06-03
  • 打赏
  • 举报
回复
最大堆
10亿个,用64位系统,可以全放进内存里。
32位,就用内存文件映射吧
mikemeego001 2011-06-03
  • 打赏
  • 举报
回复
怎样用hash去除重复?
鸵鸟 2011-06-03
  • 打赏
  • 举报
回复
max heap
cunsh 2011-06-02
  • 打赏
  • 举报
回复
直接用 stl 的 partial_sort_copy() 就可以.

算法大体上就是用序列的前n个元素构造最大堆. 然后遍历第n个以后的元素.若小于堆的最大值(即第一个元素)则把它放到堆里把原来的拿出来. 这样遍历完后堆中就是前n个最小的元素了. 再对这个堆做个堆排序就好了.具体可以参考<stl源码剖析>.


另外回复楼上: 10亿个元素比如可以放在文件中等.
游牧小小诗人 2011-06-02
  • 打赏
  • 举报
回复
10亿啊。。。这得多少内存啊~~~~~留个脚印,看看有高手没有
alweeq86 2011-06-02
  • 打赏
  • 举报
回复
vector<double>MaxNumArray;
InitialMaxNumArray();//读入前10000个数
MaxNumArray.Sort();//从大到小排序
for(long long i=10000;i<1000000000;++i)
{
double data;
read(data);
if(data>MaxNumArray[10000-1])
{
MaxNumArray.Erease(9999);
MaxNumArray.PushBack(data);
MaxNumArray.Sort();
}
}
//随便手写的
zhengguodun 2011-06-02
  • 打赏
  • 举报
回复
一个10000个元素的数组 ,一开始把前面的10000个都读进去,然后每来一个就跟这一万个比较,把最小的替换。。。
好像,,,不够高效~~~
Liby 2011-06-02
  • 打赏
  • 举报
回复
o(╯□╰)o,来踩踩,报道,新人,无法为你解惑(⊙o⊙)…

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧