下班花半个小时写了个程序,不好排版,你将就吧。
int main()
{
int *img=malloc(1000*1000*sizeof(int));
int cx=500,cy=500;
int r=100;
int range=400;
for(int n=0;n<1000*1000;n++) img[n]=rand()%10000;
int max=0;
int posex,posey;
mTimerBegin("test1");
for(int y=cy-range;y<cy+range;y++)for(int x=cx-range;x<cx+range;x++)
{
int total=0;
for(int q=y-r;q<y+r;q++)for(int p=x-r;p<x+r;p++)
if((p-x)*(p-x)+(q-y)*(q-y)<r*r) total+=img[q*1000+p];
if(total>max) {max=total;posex=x;posey=y;}
}
mTimerEnd("test1");
printf("max=%d,posex=%d,posey=%d\n",max,posex,posey);
mTimerBegin("test2");
int *g = malloc((r+1)*(r+1)*3.14*sizeof(int));
int num=0;
for(int q=0-r;q<r;q++)for(int p=0-r;p<r;p++)
if(p*p+q*q<r*r) g[num++]=q*1000+p;
max=0;
for(int y=cy-range;y<cy+range;y++)for(int x=cx-range;x<cx+range;x++)
{
int total=0;
for(int i=0;i<num;i++) total+=img[y*1000+x+g[i]];
if(total>max) {max=total;posex=x;posey=y;}
}
free(g);
mTimerEnd("test2");
printf("max=%d,posex=%d,posey=%d\n",max,posex,posey);
mTimerBegin("test3");
int *g1 = malloc((r+r)*sizeof(int));
int *g2 = malloc(r*(r+1)*3.14*sizeof(int));
int *g3 = malloc((r+r)*sizeof(int));
int num1=0,num2=0;
for(int q=0-r;q<r;q++)
{
int p=0-r;for(;p<r+1;p++){if(p*p+q*q<r*r) {g1[num1]=q*1000+p;g3[num1]=1-g1[num1];num1++; break;}}
p=p+1; for(;p<r+1;p++){if(p*p+q*q<r*r) {g2[num2]=q*1000+p; num2++;} else break;}
}
max=0;
for(int y=cy-range;y<cy+range;y++)
{
int total=0;
int x=cx-range;
int pose =y*1000+x;
for(int i=0;i<num1;i++) {total+=img[pose+g1[i]];}
for(int i=0;i<num2;i++) total+=img[pose+g2[i]];
if(total>max) {max=total;posex=x;posey=y;}
for(x++;x<cx+range;x++)
{
for(int i=0;i<num1;i++) total=total-img[pose+g1[i]]+img[pose+g3[i]];
pose++;
if(total>max) {max=total;posex=x;posey=y;}
}
}
free(g1);free(g2);free(g3);
mTimerEnd("test3");
printf("max=%d,posex=%d,posey=%d\n",max,posex,posey);
free(img);
}
你没有具体说r取多少,range取多少,img的尺寸是多少。
以上程序里暂且取img的尺寸是1000*1000,(cx,cy)取img中心(500,500),range取400,r取100。img里填充的随机数。
执行结果:
[test0.c,line 29,function main]Timer: test1 time use 21240.638672ms
max=149013407,posex=408,posey=692
[test0.c,line 45,function main]Timer: test2 time use 11485.230469ms
max=149013407,posex=408,posey=692
[test0.c,line 76,function main]Timer: test3 time use 198.951996ms
max=149013407,posex=408,posey=692
以上用了三种方法,结果都一样,第一种就是你原始的程序,耗时21秒,
第一种优化之后,耗时11秒,大概提升了一倍。
第二种优化之后,耗时<200ms,效率提升大于100倍。
当然这还不是最快的,你还可以继续优化。
【 在 FlytoSkyBoy 的大作中提到: 】
: 具体是?
:
:
--
FROM 36.7.134.*