1

代码:

for ( int i = 0 ; i < n ; i++)
    for ( int j = 0 ; j < n ; j++)
        sum += ? ;

什么是更好的?

sum += a[i][j] or
sum += a[j][i]

为什么?

4

3 回答 3

2

鉴于您有一个平方数组(列数 = 行数),运行时间/结果没有区别。

sum+=a[i][j];

前任。

1 2 3
4 5 6
7 8 9

sum= 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;

这个是通过从第一行开始并将其上的每个数字添加到总和并在它进入下一行之后得出总和。

总和+=a[j][i];

前任。

1 2 3
4 5 6
7 8 9

sum= 1 + 4 + 7 + 2 + 5 + 8 + 3 + 6 + 9;

另一方面,这个取一列中每个元素的总和,然后移到下一列。

如果您没有相同数量的行和列,则必须稍微编辑一下 for 语法。

for(int i = 0; i < n; i++)     // n = number of rows
  for(int j = 0; j < m; j++)   // m = number of columns
     sum += a[i][j];

当然在这里你可以反转 fors,和/或使用 sum+a[i][j]; 最终结果将是相同的,但总和将以另一种方式创建。

由于新信息而编辑:

告诉自己一些时间复杂度,实际上由于缓存的原因有一个小的时间差。访问靠近在一起的数据内存比相距很远的数据内存要快,所以 a[i][j] 会比 a[ j][i]。

为了查看这些差异,您需要使用一个巨大的 n 作为数组的大小。

于 2013-04-17T18:05:02.543 回答
1

就更好的而言,确实没有区别。如果您关心矩阵的总和(例如二维数组),那应该没关系。你最终会得到相同的金额。如果我们假设您使用“i”扫描行,使用“j”扫描列,那么如果您执行“sum += a[i][j]”,您将得到总和“一行一次”,如果您执行“sum += a[j][i]”,那么它将一次是一列。

因此,如果您不关心中间子项,但您关心的是总和,那么没有正确或错误的方式或更好或更坏的方式。“sum += a[i][j]”虽然更容易阅读和理解。

于 2013-04-17T18:07:23.633 回答
0

作为一般规则,在处理多维数据时,为了自己的理智,我会尽量保持字母顺序。IE:

sum += a[i][j][k]
于 2013-04-17T18:04:44.253 回答