主题:第73次编程比赛结果
boxertony [专家分:23030] 发布于 2008-10-07 23:29:00
测试结果如下:
2楼:
k=1 :耗时110毫秒;
k=10 :耗时79毫秒;
k=100 :耗时187毫秒;
k=1000 :耗时109毫秒;
k=10000 :耗时31毫秒;
k=100000 :耗时125毫秒;
k=1000000 :耗时156毫秒;
k=5000000 :耗时141毫秒;
总共花费时间938毫秒。
3楼:
k=1 :耗时15毫秒;
k=10 :耗时78毫秒;
k=100 :耗时94毫秒;
k=1000 :耗时187毫秒;
k=10000 :耗时141毫秒;
k=100000 :耗时110毫秒;
k=1000000 :耗时172毫秒;
k=5000000 :耗时250毫秒;
总共花费时间1047毫秒。
4楼: (n=100,000) (程序不太符合要求,函数参数顺序不符合我给定的函数原型)
k=1 :耗时0毫秒;
k=10 :耗时0毫秒;
k=100 :耗时15毫秒;
k=1000 :耗时125毫秒;
k=10000 :耗时1469毫秒;
总共花费时间1609毫秒。
5楼:基本同4楼,不再测试。
6楼:完全不符合要求,不再测试。
7楼:(严格说来也是不符合我的要求的,函数名不一致)
k=1 :耗时125毫秒;
k=10 :耗时141毫秒;
k=100 :耗时94毫秒;
k=1000 :耗时172毫秒;
k=10000 :耗时109毫秒;
k=100000 :耗时125毫秒;
k=1000000 :耗时172毫秒;
k=5000000 :耗时203毫秒;
总共花费时间1141毫秒。
8楼: (错误原因在于由于堆的下标是从0开始的,所以current/2并不一定是parent)
k=1 :耗时16毫秒;
k=10 :耗时0毫秒;
k=100 :耗时16毫秒;
k=1000 :耗时15毫秒;
k=10000 :耗时31毫秒;
k=100000 :耗时125毫秒;
k=1000000 :结果错误;耗时969毫秒;
k=5000000 :结果错误;耗时2156毫秒;
总共花费时间3328毫秒。
10楼:程序不完整,无法测试。
12楼:(与我提供的函数原型参数顺序不匹配)
k=1 :耗时31毫秒;
k=10 :耗时31毫秒;
k=100 :耗时31毫秒;
k=1000 :耗时31毫秒;
k=10000 :耗时78毫秒;
k=100000 :耗时141毫秒;
k=1000000 :耗时94毫秒;
k=5000000 :耗时218毫秒;
总共花费时间655毫秒。
13-17楼:
k=1 :耗时15毫秒;
k=10 :耗时16毫秒;
k=100 :耗时16毫秒;
k=1000 :耗时0毫秒;
k=10000 :耗时31毫秒;
k=100000 :结果错误;耗时156毫秒;
k=1000000 :结果错误;耗时78毫秒;
k=5000000 :结果错误;耗时188毫秒;
总共花费时间500毫秒。
20楼:
k=1 :耗时16毫秒;
k=10 :耗时31毫秒;
k=100 :耗时16毫秒;
k=1000 :耗时32毫秒;
k=10000 :结果错误;耗时2000毫秒;
k=100000 :结果错误;耗时1984毫秒;
k=1000000 :结果错误;耗时2000毫秒;
k=5000000 :结果错误;耗时2000毫秒;
总共花费时间8079毫秒。
从测试结果来看,13-17楼Chipset的程序是最快的,他采用的是快速划分+partial_sort(实际上就是堆排序)来实现的(可惜部分结果错误,但应该可以调整正确的);12楼的程序完全正确速度也非常快,比std::nth_element快40%左右。对于本题来说,我估计是划分+部分堆排序是最快的。我按照Chipset的思路写了一个,测试通过,总耗时在450ms左右。当然了,这个速度还是可以进一步提升的,呵呵
我宣布本次比赛的冠军为天边蓝(12楼),请他主持下次的编程比赛,大家鼓掌,呵呵。
测试环境: 软件 vs2008+winxp+sp3
硬件 Pentium M 3.4g
(ps: 本次比赛存在的问题是:我规定了函数的原型,可大部分人都没有按照我的要求去做。)
最后更新于:2008-10-08 08:15:00
回复列表 (共32个回复)
21 楼
GaussCheng [专家分:330] 发布于 2008-10-08 21:35:00
我发现在相同的算法下用递归的实现并不比迭代的实现慢多少啊,可参考7楼的和2,3楼的实现,况且我觉得慢那么一点的原因还不是出在递归上,有没有大牛可以详细分析一下递归究竟在那些地方会比迭代慢啊,我现在计算机组成和汇编还在学,暂时还不会做深入的分析。
22 楼
yj1221 [专家分:20] 发布于 2008-10-08 21:39:00
恩,太厉害了!参加这样的比赛真有趣,我今后还要参加。
原来我和其他人的差距有这么大,什么时候我也能编出那么好的程序呢?
恩...努力,努力。向高手学习!
23 楼
boxertony [专家分:23030] 发布于 2008-10-08 22:43:00
关键是看递归的次数与时间复杂度的比例,比如本问题时间复杂度是O(n)或者O(nlogn),而递归次数是O(1)或者O(logn),因此递归的花费相对来说是可以忽略不计的。
24 楼
JackieRasy [专家分:3050] 发布于 2008-10-08 22:44:00
我终于开始懂得游戏规则的重要性了,不过就算我明白游戏规则参赛也只能走到不远的一步,呵呵...
25 楼
GaussCheng [专家分:330] 发布于 2008-10-09 02:26:00
[quote]关键是看递归的次数与时间复杂度的比例,比如本问题时间复杂度是O(n)或者O(nlogn),而递归次数是O(1)或者O(logn),因此递归的花费相对来说是可以忽略不计的。[/quote]
也就是说这额外的花销还是出在函数的调用上?我现在只知道对于函数的调用,他要在系统的运行时栈中保存返回地址,参数还有局部变量,但是对于把递归转迭代成实现,一般都要自己来维护一个栈,这样不是一样会引人额外花销吗。[em18]
26 楼
boxertony [专家分:23030] 发布于 2008-10-09 08:20:00
是的。
递归转非递归并不是都是需要栈的。有些是可以直接通过循环来实现,比如阶乘。
27 楼
Chipset [专家分:16190] 发布于 2008-10-09 11:29:00
我的笔记本CPU是2.1GHz双核的联想E41,很垃圾的电脑,比你的3.4GHz低很多,下面是时间。我估计你的系统可能有点问题,否则不可能那么慢,也不排除中文版操作系统可能效率低一点。
//同时运行maxk和nth_element
testing is in progress ...
10 times tested, on average: 456 ms
Press any key to continue . . .
testing is in progress ...
10 times tested, nth_element on average: 820 ms
Press any key to continue . . .
//同时运行两个nth_element
testing is in progress ...
10 times tested, nth_element on average: 862 ms
Press any key to continue . . .
testing is in progress ...
10 times tested, nth_element on average: 851 ms
Press any key to continue . . .
//同时运行两个maxk
testing is in progress ...
10 times tested, on average: 492 ms
Press any key to continue . . .
testing is in progress ...
10 times tested, on average: 481 ms
Press any key to continue . . .
28 楼
boxertony [专家分:23030] 发布于 2008-10-09 13:07:00
那就奇怪了,我的电脑是Dell的台式机Optiplex 745,从一开始买来就是这个速度(我用其他软件测过)。而且好像还有其他的笔记本(CPU是迅驰1.7G)的电脑测试也比我的台式机快。难道是我的RP问题?呵呵。
29 楼
boxertony [专家分:23030] 发布于 2008-10-09 13:08:00
对了,能把你的这个测试程序(编译好的)发给我试试吗?看看究竟是优化的问题还是系统的问题。谢谢。fairless@263.sina.com
30 楼
春天的卫士 [专家分:0] 发布于 2008-10-10 14:15:00
[size=22]高手真多![/size]
我来回复