回 帖 发 新 帖 刷新版面

主题:第73次编程比赛结果

测试结果如下:
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: 本次比赛存在的问题是:我规定了函数的原型,可大部分人都没有按照我的要求去做。)

回复列表 (共32个回复)

21 楼

我发现在相同的算法下用递归的实现并不比迭代的实现慢多少啊,可参考7楼的和2,3楼的实现,况且我觉得慢那么一点的原因还不是出在递归上,有没有大牛可以详细分析一下递归究竟在那些地方会比迭代慢啊,我现在计算机组成和汇编还在学,暂时还不会做深入的分析。

22 楼

恩,太厉害了!参加这样的比赛真有趣,我今后还要参加。
原来我和其他人的差距有这么大,什么时候我也能编出那么好的程序呢?
恩...努力,努力。向高手学习!

23 楼

关键是看递归的次数与时间复杂度的比例,比如本问题时间复杂度是O(n)或者O(nlogn),而递归次数是O(1)或者O(logn),因此递归的花费相对来说是可以忽略不计的。

24 楼

我终于开始懂得游戏规则的重要性了,不过就算我明白游戏规则参赛也只能走到不远的一步,呵呵...

25 楼

[quote]关键是看递归的次数与时间复杂度的比例,比如本问题时间复杂度是O(n)或者O(nlogn),而递归次数是O(1)或者O(logn),因此递归的花费相对来说是可以忽略不计的。[/quote]

也就是说这额外的花销还是出在函数的调用上?我现在只知道对于函数的调用,他要在系统的运行时栈中保存返回地址,参数还有局部变量,但是对于把递归转迭代成实现,一般都要自己来维护一个栈,这样不是一样会引人额外花销吗。[em18]

26 楼

是的。
递归转非递归并不是都是需要栈的。有些是可以直接通过循环来实现,比如阶乘。

27 楼

我的笔记本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 楼

那就奇怪了,我的电脑是Dell的台式机Optiplex 745,从一开始买来就是这个速度(我用其他软件测过)。而且好像还有其他的笔记本(CPU是迅驰1.7G)的电脑测试也比我的台式机快。难道是我的RP问题?呵呵。

29 楼

对了,能把你的这个测试程序(编译好的)发给我试试吗?看看究竟是优化的问题还是系统的问题。谢谢。fairless@263.sina.com

30 楼

[size=22]高手真多![/size]

我来回复

您尚未登录,请登录后再回复。点此登录或注册