回 帖 发 新 帖 刷新版面

主题:第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个回复)

11 楼

[quote]我找到Chipset的错误原因了。下面的语句
      RandomAccessIterator cut = unguarded_partition(first, last,
        T(median(*first, *(first + (d2 >> 1)), *(last - 1), cmp)));
应改为:
      RandomAccessIterator cut = unguarded_partition(first, last,
        T(median(*first, *(first + (d2 >> 1)), *(last - 1), cmp)), cmp);

改了后我重新测试了一下,平均470ms
[/quote]

重新看了一遍程序,我也发现了,就是你说的问题,纯属笔误,惭愧啊。

12 楼

谢谢楼主,要不是顺便贴代码,也发现不了这个问题。

我自己写了检测排序的泛型算法程序,测试总发现没有问题,因为我电脑上的那个是最新的版本,有cmp,而贴上来的这个比较古老,少了个cmp,真是荒唐。

13 楼

楼主,说句真的,你的VS2008 IDE编译显然不及GCC编译器优化能力强,我用GCC 4.3.2编译O3优化,我的CPU主频比你的低很多,程序单线程运行,也就是CPU只用一个核心,但是程序运行速度比你的快很多。

nth_element在我的电脑上,本程序不到700毫秒,在你的电脑上则900毫秒。微软是C++的铁杆用户,Windows 9X系列,Windows XP,Windows NT系列,.net框架,VS, SQL, Office等都用C++写的,就连自己的C#语言编译器也是用C++做的,但是做出来的VS优化能力怎么这么差?真是让人难以置信。

14 楼

[quote]楼主,说句真的,你的VS2008 IDE编译显然不及GCC编译器优化能力强,我用GCC 4.3.2编译O3优化,我的CPU主频比你的低很多,程序单线程运行,也就是CPU只用一个核心,但是程序运行速度比你的快很多。

nth_element在我的电脑上,本程序不到700毫秒,在你的电脑上则900毫秒。微软是C++的铁杆用户,Windows 9X系列,Windows XP,Windows NT系列,.net框架,VS, SQL, Office等都用C++写的,就连自己的C#语言编译器也是用C++做的,但是做出来的VS优化能力怎么这么差?真是让人难以置信。[/quote]
我没用过GCC,不知道二者优化能力的差异有多大。不过,关于本程序速度,即使有差异也不会那么大。之所以我的显得慢我想是因为在我电脑上运行CPU占用率只有50%,而在你的笔记本上CPU占用率是100%造成的。

15 楼

兄弟,我单线程运行的程序,也就是说只用一个核心运行的本程序,进程管理器当然显示CPU占用率大约50%,正是因为如此,同样只用一个核心,所以才想不明白你的怎么那么慢。

16 楼

系统配置:IBM T23 2647 N16
CPU PIII 1.13GHz, RAM 512M, OS Windows XP Professional SP2 英文版, Compiler g++ 3.4.5
//看到了吧,俺的古董笔记本电脑,CPU是奔三处理器,居然也能跑起来。

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Chipset>d:

D:\>g++ -O3 -o nth nth_element.cpp

D:\>nth
testing in progress ...
10 times tested, nth_element on average: 3120 ms
Press any key to continue . . .

D:\>nth
testing in progress ...
10 times tested, nth_element on average: 3006 ms
Press any key to continue . . .

D:\>nth
testing in progress ...
10 times tested, nth_element on average: 3083 ms
Press any key to continue . . .

D:\>cd maxk

D:\maxk>g++ -O3 -o maxk maxk.cpp

D:\maxk>maxk
testing in progress ...
10 times tested, on average: 1654 ms
Press any key to continue . . .

D:\maxk>maxk
testing in progress ...
10 times tested, on average: 1670 ms
Press any key to continue . . .

D:\maxk>maxk
testing in progress ...
10 times tested, on average: 1621 ms
Press any key to continue . . .

D:\maxk>

17 楼

[quote]兄弟,我单线程运行的程序,也就是说只用一个核心运行的本程序,进程管理器当然显示CPU占用率大约50%,正是因为如此,同样只用一个核心,所以才想不明白你的怎么那么慢。[/quote]
你是说你的程序全力运行时CPU占用率也只有50%?
我的CPU是双核的。我的电脑上,一个本程序运行nth测得时间是500ms,两个程序同时运行,各自测得的也还是500ms。不知你的电脑上是否也是如此?

18 楼

不明白的我的算法怎么不符合要求了???????????????????????

19 楼


请问,我的算法怎么不符合要求呢??
不明白呀,六楼的

20 楼

呵呵,你得按我的要求来做啊。我提供函数原型,结果你自顾自的去写程序了。

我来回复

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