打印

for循环优化问题

[复制链接]
1049|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 | 只看该作者
如果不能改算法,就将能够提前算出的表达式用变量代替,并放到循环外。

使用特权

评论回复
5
yybj| | 2013-7-29 15:38 | 只看该作者
pkat 发表于 2013-7-28 18:54
1、用一维数组代替二维数组;
2、(i-r)*(i-r)+(j-r)*(j-r))

很好的建议

使用特权

评论回复
6
sinadz| | 2013-7-29 16:04 | 只看该作者
可以考虑用链表

使用特权

评论回复
7
秋天落叶| | 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) ) ...

转换成整型运算试试

使用特权

评论回复
8
火箭球迷| | 2013-7-29 16:22 | 只看该作者
不建议这么用for循环。。。

使用特权

评论回复
9
sinadz| | 2013-7-29 21:56 | 只看该作者
这样用for循环,效率肯定不会高

使用特权

评论回复
10
无冕之王| | 2013-7-29 22:06 | 只看该作者
建议换一种思路编程,这样效率是不会高的

使用特权

评论回复
11
hsbjb| | 2013-7-29 22:29 | 只看该作者
可以考虑一下采用其他方式

使用特权

评论回复
12
pkat| | 2013-7-30 14:41 | 只看该作者
这个for循环的确是太多了

使用特权

评论回复
13
xsgy123| | 2013-7-30 14:51 | 只看该作者
for循环这么用,效率肯定是不会高的

使用特权

评论回复
14
火箭球迷| | 2013-7-30 14:56 | 只看该作者
可以用链表的思路试试

使用特权

评论回复
15
dfsa| | 2013-7-30 19:39 | 只看该作者
不建议这么用for循环

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

239

主题

2284

帖子

0

粉丝