免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: aero
打印 上一主题 下一主题

在10000000个数(int)中求最小的10000个数 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2007-08-23 11:09 |只看该作者
说实话这个火星不得了的火星题我真的没什么兴趣。
不过, 的确nth_element并不是最快的。
不知道的请google"炒冷饭 从一道笔试题谈算法优化"

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
52 [报告]
发表于 2007-08-23 11:46 |只看该作者
原帖由 jigloo 于 2007-8-23 11:09 发表
说实话这个火星不得了的火星题我真的没什么兴趣。
不过, 的确nth_element并不是最快的。
不知道的请google"炒冷饭 从一道笔试题谈算法优化"


测试了一下你的solution_4,应该是你最快的算法吧,还是比nth_element慢约1倍,VC6测试的,GCC没测,估计也差不多。所以你说nth_element并不是最快的以你的代码说明不了,找更快的吧。

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
53 [报告]
发表于 2007-08-23 11:48 |只看该作者
TO converse:

map不可取,速度和空间都是数量级的差别,我没说错,呵呵。

论坛徽章:
0
54 [报告]
发表于 2007-08-23 11:48 |只看该作者
看solution_6

ps:非必要请勿quote我的发言,我很不安,觉得是在跟人吵架。

[ 本帖最后由 jigloo 于 2007-8-23 11:53 编辑 ]

论坛徽章:
0
55 [报告]
发表于 2007-08-23 12:07 |只看该作者
原帖由 jigloo 于 2007-8-23 10:06 发表

既然用了stl的话,还可以写得紧凑些

#include
#include
#include
#include
#include
#include
#include

using namespace std;

void main()
{
        vector vecTmp;
        generate_n(back_ins ...

既然用了C++,就不要出现void main()这个情况。

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
56 [报告]
发表于 2007-08-23 12:08 |只看该作者

solution_6确实更好,但仍比nth_element差约20%,不用测了吧。

论坛徽章:
0
57 [报告]
发表于 2007-08-23 12:37 |只看该作者
一千万个整数,找出一万个小的数,
一千万除以一万等于一千。
每次都读取一千个整数,然后找出其中的最小数,这里就很快找到了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
58 [报告]
发表于 2007-08-23 12:37 |只看该作者
原帖由 jigloo 于 2007-8-23 11:09 发表
说实话这个火星不得了的火星题我真的没什么兴趣。
不过, 的确nth_element并不是最快的。
不知道的请google"炒冷饭 从一道笔试题谈算法优化"


Thanks.

以前真没碰到过这个问题。

论坛徽章:
0
59 [报告]
发表于 2007-08-23 12:40 |只看该作者
数量级太小,solution_6与nth谁快看不出来的。

论坛徽章:
0
60 [报告]
发表于 2007-08-23 12:56 |只看该作者
原帖由 aero 于 2007-8-22 22:38 发表
^_^,大家有没有啥好算法?

偶今天下午写了一个,可以达到62ms数量级。

简单思路:前10000个数做成一个大顶堆,但不排序,不是堆排序。后面再来的数,直接与堆顶比较,大于的直接continue,小于的替换堆顶 ...


调整堆还得遍历那1000个数以保证最大的在上, 似乎不经济. 我觉得还是要排序. 计数排序是个不错的选择. (10,000,000 * 4Byte) / (1024 * 1024) < 39MB, 空间上可以忍受吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP