免费注册 查看新帖 |

Chinaunix

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

如何取得一个很长的链表的前20大元素 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-09-20 10:40 |只看该作者

testReback

ttres

论坛徽章:
0
12 [报告]
发表于 2007-09-20 11:04 |只看该作者
似乎至少遍历一次链表,复杂度最低也是O(n)...

论坛徽章:
0
13 [报告]
发表于 2007-09-20 11:31 |只看该作者

回复 #11 edgar 的帖子

特设他

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
14 [报告]
发表于 2007-09-20 17:18 |只看该作者
原帖由 iceviewer 于 2007-9-20 11:04 发表
似乎至少遍历一次链表,复杂度最低也是O(n)...

适当的优化可以降低常系数.

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-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:27
15 [报告]
发表于 2007-09-20 17:38 |只看该作者
实验证明std::priority_queue是最快的。

论坛徽章:
0
16 [报告]
发表于 2007-09-21 22:27 |只看该作者
我有一个想法:只要遍历一次链表就行了。
但前提是这个作者应该对这个链表的数据的大小有一定的了解。它应该介于多大之间,这样才好用位图。
借助位图(bit map)来实现:假设这个数最大为4096。我只是打个比方,具体情况只要你了解这个想法,就应该可以知道如何变通了。

定义一个数组为:char a[4096]={0,};
然后遍历链表,假设第一个数据为12,那么就将a[12]置为'1',如果第二个数为8,就将a[8]置为'1',当数为234时,就将a[234]置为'1',依次类推。

遍历一遍链表之后,就会发现a[] = “010011111000011......1111100101010”这样的序列。想找最大的20个数就直接到数组的后面开始找20个‘1’的数组下标即可。

如果数据很多的话,应该比一般的算法效率高的。但是如果数的跨度太大,可能会浪费一些空间,比如最小数为1,最大为23456767 ,不过可以在这个基础上进行相应的优化,相信可以做到的。

论坛徽章:
0
17 [报告]
发表于 2007-09-23 19:48 |只看该作者
partial_sort, nth_element

论坛徽章:
0
18 [报告]
发表于 2007-09-23 20:53 |只看该作者
quicksort
如果超过内存限制而且数据不重复,具体操作编程珠玑上有讲
原帖由 foolishx 于 2007-9-21 22:27 发表
我有一个想法:只要遍历一次链表就行了。
但前提是这个作者应该对这个链表的数据的大小有一定的了解。它应该介于多大之间,这样才好用位图。
借助位图(bit map)来实现:假设这个数最大为4096。我只是打个比方 ...

[ 本帖最后由 fertiland 于 2007-9-23 21:01 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-09-23 20:53 |只看该作者
如果真的是相对20来讲很长的连表,那采用20个缓存进行插入排序,无可厚非了吧
毕竟程序到后期很容易稳定的,上万个数能不断的插入(除非元素大致升序)。随机数无所谓!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP