免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
21 [报告]
发表于 2007-08-22 23:53 |只看该作者
原帖由 yecheng_110 于 2007-8-22 23:52 发表

遍历一次就够了
看看桶排序(和他们说的计数排序应该是一样的吧)就明白了


嗯,学习ing……

论坛徽章:
0
22 [报告]
发表于 2007-08-22 23:58 |只看该作者
原帖由 aero 于 2007-8-22 23:52 发表


前10000个数。


哦,如果用C++的话就用map好了,把全部的数据插入进去,取前10000个就是了.

如果要自己写算法,map底层是用的堆排序算法.

论坛徽章:
0
23 [报告]
发表于 2007-08-23 00:04 |只看该作者
原帖由 converse 于 2007-8-22 23:58 发表


哦,如果用C++的话就用map好了,把全部的数据插入进去,取前10000个就是了.

如果要自己写算法,map底层是用的堆排序算法.


居然想到用map

论坛徽章:
0
24 [报告]
发表于 2007-08-23 00:07 |只看该作者
原帖由 bb2bb 于 2007-8-23 00:04 发表


居然想到用map


有什么问题吗?请指教.

论坛徽章:
0
25 [报告]
发表于 2007-08-23 00:11 |只看该作者
计数排序太费空间,小军帽1楼的方法是可行的,由于是求最小10000,效率也可以保证

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
26 [报告]
发表于 2007-08-23 00:18 |只看该作者
建堆(优先队列),算法时间复杂度o(n*logm),n在这里是100000000,m在这里是10000

论坛徽章:
0
27 [报告]
发表于 2007-08-23 00:21 |只看该作者
计数排序的
时间复杂度O(n)
空间复杂度O(n),是有点大,
看LZ的需要了

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
28 [报告]
发表于 2007-08-23 00:24 |只看该作者
大家都还没睡呀

论坛徽章:
0
29 [报告]
发表于 2007-08-23 00:40 |只看该作者
原帖由 converse 于 2007-8-23 00:07 发表


有什么问题吗?请指教.


当然有问题了,问题还不是一般的大。这个问题用vector才有效率,map的存储比它差远了。

我写了一个简单的,希望搂主和这个算法先作一下比较,看看谁的更快,这是标准算法,如果能超过这个那可能标准算法还可以优化一下了。



  1. #include <vector>
  2. #include <algorithm>
  3. #include <sys/time.h>

  4. int main()
  5. {
  6.         std::vector<int> datalist;
  7.        
  8.         printf("making data...\n");
  9.         for(unsigned int i=0;i<10000000;i++)
  10.         {
  11.                 datalist.push_back(rand());
  12.         }
  13.        
  14.         printf("sorting data...\n");
  15.         static struct timeval begin,end;
  16.     gettimeofday( &begin, NULL );
  17.        
  18.         nth_element(datalist.begin(),datalist.begin()+10000,datalist.end());
  19.        
  20.     gettimeofday( &end, NULL );
  21.         printf("sort end\n");
  22.        
  23.         long us=(end.tv_sec - begin.tv_sec)*1000*1000 + (end.tv_usec - begin.tv_usec);
  24.        
  25.         printf("time=%ld us\n", us);

  26.         return 0;
  27. }

复制代码

论坛徽章:
0
30 [报告]
发表于 2007-08-23 01:52 |只看该作者
原帖由 bb2bb 于 2007-8-23 00:40 发表


当然有问题了,问题还不是一般的大。这个问题用vector才有效率,map的存储比它差远了。

我写了一个简单的,希望搂主和这个算法先作一下比较,看看谁的更快,这是标准算法,如果能超过这个那可能标准算法 ...


.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP