社区
C++ 语言
帖子详情
有10亿个浮点数,从中找出1万个最大的数。写一个高性能的算法
mikemeego001
2011-06-02 08:47:00
rtt
...全文
358
11
打赏
收藏
有10亿个浮点数,从中找出1万个最大的数。写一个高性能的算法
rtt
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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⊙)…
有
10
亿个
浮点
数
,
从中
找出
1
万个
最大
的
数
。
有
10
亿个
浮点
数
,
从中
找出
1
万个
最大
的
数
。
写
一个
高性能
的
算法
算法
和
数
据结构1.
一个
数
组,大小
10
000,指针指向头尾部,称min和max 2.排序下(
算法
自选吧) 3.比min指针小的
数
字,忽略;大于max的,max指针移到min指针位置,min右移一步.介于两者之间的,max指针不动,min右移. 4.当min指针到达
数
组最右端(无论max指针是否是在这里),排序一下子,两指针回到原来位置
海量
数
据处理:有1
亿个
浮点
数
,
找出
其中
最大
的
10
000个
第一种方法是将
数
据全部排序,然后在排序后的集合中进行查找,最快的排序
算法
的时间复杂度一般为O(nlogn),例如快速排序.而在32位机器上,每个float类型占4B,1
亿个
浮点
数
就要占用400M的存储空间,对于一些可以内存小于400MB的计算机而言,显然是不能一次将全部
数
据读入内存进行排序的.其实即使内存能满足要求,该方法也不高效,因为题目的目的是寻
找出
最大
的
10
000个
数
即可,而排序是将所有元素...
有
10
亿个
浮点
数
,
找出
一
万个
最大
的
数
给
一个
基于最小二叉堆的方案: 第一阶段,向最小二叉堆中插入前一
万个
浮点
数
; 第二阶段,从第一万零
一个
浮点
数
开始,将之与最小二叉堆顶部的最小值比较。如果小于这个最小值,把最小值弹出并将新值插入到二叉堆中。重复此过程直到遍历完成。 . 创建长度一万的二叉树。 2. 遍历剩余的
浮点
数
,若大于最小值则插入二叉树并删除最小的节点,否则略过。 这基本上是
一个
较优的
算法
,复杂度为: 千万级(一万的排序)
面试-从
10
亿个
浮点
数
中
找出
最大
的1
万个
从一道笔试题谈
算法
优化出处引子每年十一月各大IT公司都不约而同、争后恐后地到各大高校进行全国巡回招聘。与此同时,网上也开始出现大量笔试面试题;网上流传的题目往往都很精巧,既能让考查基础知识,又在平淡中隐含了广阔的天地供优秀学生驰骋。这两天在网上淘到一道笔试题目(注1),虽然真假未知,但的确是道好题,题目如下: 从
10
亿个
浮点
数
中
找出
最大
的1
万个
。这是一道似易实难
编
写
算法
,从
10
亿个
浮点
数
当中,选出其中
最大
的
10
000个
编
写
算法
,从
10
亿个
浮点
数
当中,选出其中
最大
的
10
000个。
用外部排序,在《
数
据结构》书上有
《计算方法导论》在找到第n大的
数
的
算法
上加工(注意:先将
数
据进行分割成
数
据量小的一些文件,如
10
00000个
数
据为
一个
文件,然后将每个文件
数
据进行排序,用快速排序法排序,然后使用K路合并法将其合并到
一个
文件下,取出排序好的
最大
的
10
000个
数
据)
另解:(1)读一次所有
数
据,得出
最大
和最小。(2)用
最大
和最小,分
10
0个区间dx = (x_max - x_min) / 1
C++ 语言
65,198
社区成员
250,522
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章