主题:第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个回复)
11 楼
Chipset [专家分:16190] 发布于 2008-10-08 13:42:00
[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 楼
Chipset [专家分:16190] 发布于 2008-10-08 13:50:00
谢谢楼主,要不是顺便贴代码,也发现不了这个问题。
我自己写了检测排序的泛型算法程序,测试总发现没有问题,因为我电脑上的那个是最新的版本,有cmp,而贴上来的这个比较古老,少了个cmp,真是荒唐。
13 楼
Chipset [专家分:16190] 发布于 2008-10-08 14:16:00
楼主,说句真的,你的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 楼
boxertony [专家分:23030] 发布于 2008-10-08 15:08:00
[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 楼
Chipset [专家分:16190] 发布于 2008-10-08 15:12:00
兄弟,我单线程运行的程序,也就是说只用一个核心运行的本程序,进程管理器当然显示CPU占用率大约50%,正是因为如此,同样只用一个核心,所以才想不明白你的怎么那么慢。
16 楼
Chipset [专家分:16190] 发布于 2008-10-08 15:50:00
系统配置: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 楼
boxertony [专家分:23030] 发布于 2008-10-08 16:52:00
[quote]兄弟,我单线程运行的程序,也就是说只用一个核心运行的本程序,进程管理器当然显示CPU占用率大约50%,正是因为如此,同样只用一个核心,所以才想不明白你的怎么那么慢。[/quote]
你是说你的程序全力运行时CPU占用率也只有50%?
我的CPU是双核的。我的电脑上,一个本程序运行nth测得时间是500ms,两个程序同时运行,各自测得的也还是500ms。不知你的电脑上是否也是如此?
18 楼
strugglemyself [专家分:100] 发布于 2008-10-08 18:00:00
不明白的我的算法怎么不符合要求了???????????????????????
19 楼
strugglemyself [专家分:100] 发布于 2008-10-08 18:13:00
请问,我的算法怎么不符合要求呢??
不明白呀,六楼的
20 楼
boxertony [专家分:23030] 发布于 2008-10-08 19:45:00
呵呵,你得按我的要求来做啊。我提供函数原型,结果你自顾自的去写程序了。
我来回复