非常感谢,我试试
【 在 qyli 的大作中提到: 】
: 下班花半个小时写了个程序,不好排版,你将就吧。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.638672msmax=149013407,posex=408,posey=692[test0.c,line 45,function main]Timer: test2 time use 11485.230469msmax=149013407,posex=408,posey=692[test0.c,line 76,function main]Timer: test3 time use 198.951996msmax=149013407,posex=408,posey=692以上用了三种方法,结果都一样,第一种就是你原始的程序,耗时21秒,第一种优化之后,耗时11秒,大概提升了一倍。第二种优化之后,耗时<200ms,效率提升大于100倍。当然这还不是最快的,你还可以继续优化。【 在 FlytoSkyBoy 的大作中提到: 】: 具体是?::--
来自 MZ TECH
--
FROM 223.166.142.*