免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1376 | 回复: 5
打印 上一主题 下一主题

优化一道小题目,大家看看啊! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-23 19:25 |只看该作者 |倒序浏览
求二维数组的和
a[m][n]

int sum=0;

int sum_array(int *a[],m,n){
int i,j;

for(i=0;i<m;i++)
     for(j=0;j<n;j++)
     sum +=a[i][j];

return sum;
}
请优化上面的代码?
汗,根本不知道怎么下手,大家帮忙看看。

论坛徽章:
0
2 [报告]
发表于 2006-10-23 19:49 |只看该作者
是不是从时间复杂度考虑?
编译优化?

论坛徽章:
0
3 [报告]
发表于 2006-10-23 20:08 |只看该作者

  1. int sum=0;

  2. int sum_array(int *a[],m,n){
  3. int i,j;

  4. for(i=0;i<m;i++)
  5.      for(j=0;j<n;j++)
  6.      sum +=a[i][j];

  7. return sum;
  8. }
复制代码


没几行代码,能作的比较少.我能想起来的只有引入一个中间变量.

  1. int sum=0;

  2. int sum_array(int *a[], int m, int n){
  3.         int i,j;
  4.         int* rowStart = NULL;

  5.         for(i=0;i<m;i++)
  6.         {
  7.                 rowStart = a[i];
  8.                 for(j=0;j<n;j++)
  9.                         sum += *(rowStart + j);
  10.         }

  11.         return sum;
  12. }
  13. 通过引入一个记录二维数组行首地址的指针,减少计算过程中计算a[i][j]元素的地址的一些重复操作.
  14. 不过不一定有用,现在某些编译器在进行性能优化时应当能做到这一点.
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-10-23 23:12 |只看该作者
我想,应该可以这样,先用个指针指向二维数组设为p=a,再计算二维数组最后一个数据的地址q=&a[m][n]
*p为第一个数据,
*(p++)为第二个数据
....


则用语句即可算出: for (p=a; p<=q; p++) sum+=*p;

论坛徽章:
0
5 [报告]
发表于 2006-10-23 23:25 |只看该作者
对于这种代码,要优化当然首先会想到用消除循环的方法

1、
int sum_array(int *a[], int m, int n)
{
        int *p = &a[0][1];
        int *q = &a[m][n];

        int sum = a[0][0];
     
        while (p <= q)
              sum += *p++;

        return sum;
}


2、
int sum_array(int *a[], int m, int n)
{
     int i = m * n;
     int *p = &a[0][0];
     int sum = a[0][0];

     while (i /= 8 ) {
          sum += p[1];
          sum += p[2];
          sum += p[3];
          sum += p[4];
          sum += p[5];
          sum += p[6];
          sum += p[7];
          sum += p[8];
          p++;
     }

     i = m * n % 8;
     while (i--)            
          sum += p[i];
     
     return sum;
}

论坛徽章:
0
6 [报告]
发表于 2006-10-23 23:49 |只看该作者
*(p++)为第二个数据

不好意思这个不对,写快了~!应该是*(++p)或*(p+1)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP