读书人

请教这个C程序为什么运行会这样地慢

发布时间: 2012-02-20 21:18:23 作者: rapoo

请问这个C程序为什么运行会这样地慢?
代码是一个算法,求一个N x N的方阵内的最大矩形,其中方阵内的有些点是不可使用的。
比如输入
4
0 1 0 1
0 0 0 0
0 0 0 0
1 1 1 0

1表示不可用的点,对于这个例子,中间两行构成了一个最大的矩形面积为8

我用C写了一个代码,算法复杂度是O(N ^2)。
但是居然对所有的测试点运行了17s+,但是标程方法之类似,于是我就把我的C代码直接翻译到Pascal编译。居然只要6s+就跑完了。

是不是我写的C有点问题?因为我是刚转入C语言的,没几个月,可能写法有些缺陷?

下面给出我的代码:
#include <stdio.h>
#define MAXN 2010
#define min(x,y) ((x) > (y) ? (y) : (x))

long N,max = 0,top = 0;
long h[MAXN],map[MAXN];
long stack[MAXN],row[MAXN];
int main(){
long i,j,topr,toph;

freopen( "dzi.in ", "r ",stdin);
freopen( "dzi.out ", "w ",stdout);

scanf( "%d ",&N);

for (i = 1; i <= N; i++){
top = 0;
for (j = 1; j <= N; j++){
scanf( "%d ",&map[j]);
if (map[j] == 1) h[j] = 0;
else h[j]++;
}
for (j = 1; j <= N + 1; j++){
if ((top == 0) || (stack[top] < h[j])){
top++;
stack[top] = h[j];
row[top] = j;
}
if (h[j] == stack[top]) continue;
while((top > 0) && (stack[top] > h[j])){
toph = stack[top];
topr = row[top];
top--;
if (toph * (j - topr) > max)


max = toph * (j - topr);
}
if (h[j] == stack[top]) continue;
top++;
stack[top] = h[j];
row[top] = topr;
}
}

printf( "%d\n ",max);
return 0;
}



[解决办法]
我跑了一下你的程序,连1s都不到(双核+2G RAM)
[解决办法]
这个和环境的优化有些关系吧
[解决办法]
你编译选项有问题吧, 在我这 跑 4*4 , 2000*2000 都小于1秒 ... PM1.4G 1G RAM ..

这东东貌似 C Pascal 应该速度差不多 ...
[解决办法]
gcc 确实稍微慢点,可能是俺编译选项有点问题, 不过也不会慢的这样离谱 ....

$ ll dzi.in ; gcc -O3 -Os -o 1gcc 1.c ; cl -nologo -O2 -Ox -Og 1.c /link /out:1cl; time ./1gcc ; time ./1cl;
-rw-r--r-- 1 [XXXXX] 8002005 Apr 2 10:23 dzi.in
1.c

real 0m2.947s
user 0m2.423s
sys 0m0.020s

real 0m0.913s
user 0m0.010s
sys 0m0.020s

[解决办法]
没调啥东西呀, 只是改改编译选项而已, 这东东也能做竞赛题, 晕 ...
[解决办法]
一行一行处理,似乎也差不多啊?
-------------------------------
lz做过实验没有,如果做过,我就没话说了,如果没做过,是不是能够先做一下,再看看效果呢

一会有个会,下午来看

读书人网 >C语言

热点推荐