for循环优化问题

[复制链接]
1540|14
 楼主| baidudz 发表于 2013-7-28 18:37 | 显示全部楼层 |阅读模式
我的程序由于for循环过多而导致速度很慢,求高手帮忙优化啊!
原代码比较复杂,我已经将其简化如下:
int width = 8000;
int cell[4][4], p[4][8000];//p中各个元素的值或为0或为1
int i, j, r = 2;
for(i=0; i<(4+1)/2; i++)
{
for(j=i; j<(4+1)/2; j++)
{
if ( ((i-r)*(i-r)+(j-r)*(j-r)) < (r+0.5)*(r+0.5) )
{
cell[i][j]         = 1;
cell[i][4-1-j] = 1;
cell[j][i]         = 1;
cell[j][4-1-i] = 1;
cell[4-1-i][j] = 1;
cell[4-1-i][4-1-j] = 1;
cell[4-1-j][i] = 1;
cell[4-1-j][4-1-i] = 1;
}
}
}
int n = 0;
for(int k = 0; k < 8000; k++)
{
n = 0;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
if(cell[i][j] != 0 && p[i][k] != 0)
n++;
}
//后面还有类似的for循环,且会对cell的值做修改
}
pkat 发表于 2013-7-28 18:54 | 显示全部楼层
1、用一维数组代替二维数组;
2、(i-r)*(i-r)+(j-r)*(j-r))<(r+0.5)*(r+0.5)这个关于(i,j)的条件可以直接建表,不要每次都去计算。
gxgclg 发表于 2013-7-28 19:05 | 显示全部楼层
貌似可以转化成整型运算,提高点速度。
  if ( ((i-r)*(i-r)+(j-r)*(j-r)) < (r+0.5)*(r+0.5) )
火箭球迷 发表于 2013-7-28 19:17 | 显示全部楼层
如果不能改算法,就将能够提前算出的表达式用变量代替,并放到循环外。
yybj 发表于 2013-7-29 15:38 | 显示全部楼层
pkat 发表于 2013-7-28 18:54
1、用一维数组代替二维数组;
2、(i-r)*(i-r)+(j-r)*(j-r))

很好的建议
sinadz 发表于 2013-7-29 16:04 | 显示全部楼层
可以考虑用链表
秋天落叶 发表于 2013-7-29 16:15 | 显示全部楼层
gxgclg 发表于 2013-7-28 19:05
貌似可以转化成整型运算,提高点速度。
  if ( ((i-r)*(i-r)+(j-r)*(j-r)) < (r+0.5)*(r+0.5) ) ...

转换成整型运算试试
火箭球迷 发表于 2013-7-29 16:22 | 显示全部楼层
不建议这么用for循环。。。
sinadz 发表于 2013-7-29 21:56 | 显示全部楼层
这样用for循环,效率肯定不会高
无冕之王 发表于 2013-7-29 22:06 | 显示全部楼层
建议换一种思路编程,这样效率是不会高的
hsbjb 发表于 2013-7-29 22:29 | 显示全部楼层
可以考虑一下采用其他方式
pkat 发表于 2013-7-30 14:41 | 显示全部楼层
这个for循环的确是太多了
xsgy123 发表于 2013-7-30 14:51 | 显示全部楼层
for循环这么用,效率肯定是不会高的
火箭球迷 发表于 2013-7-30 14:56 | 显示全部楼层
可以用链表的思路试试
dfsa 发表于 2013-7-30 19:39 | 显示全部楼层
不建议这么用for循环
您需要登录后才可以回帖 登录 | 注册

本版积分规则

239

主题

2284

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部