首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-20 
请问这个C程序为什么运行会这样地慢?代码是一个算法,求一个NxN的方阵内的最大矩形,其中方阵内的有些点是不

请问这个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做过实验没有,如果做过,我就没话说了,如果没做过,是不是能够先做一下,再看看效果呢

一会有个会,下午来看

热点排行