【问题标题】:Summing a 2 dimensional array [duplicate]对二维数组求和[重复]
【发布时间】:2013-04-10 14:54:24
【问题描述】:

代码:

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

什么更好?

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

为什么?

【问题讨论】:

  • 什么语言? (我猜是 C?)
  • 您似乎不了解二维数组的工作原理。 a[n] 表示“以 n 为索引的数组”,a[n][m] 表示“在以 n 为索引的数组的位置 m 处索引的值”,因此除非我们在讨论某些特定情况,否则这些不是可互换。
  • @大卫罗宾逊。是的。但是,您使用的语言有区别吗?
  • 我知道它是如何工作的,我也知道不同的 n*m 矩阵。你会得到不同的表现。只想知道缓存方面
  • a[i][j],可能是由于空间局部性。

标签: c for-loop multidimensional-array


【解决方案1】:

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

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

【讨论】:

  • 有道理,但在性能上仍然存在差异。这就是我一直这样做的方式。但你也必须牢记程序的性能
【解决方案2】:

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

sum+=a[i][j];

例如

1 2 3
4 5 6
7 8 9

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

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

sum+=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 作为数组的大小。

【讨论】:

  • 感谢您的帮助。我喜欢您的编辑,它回答了我的问题:D
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2020-08-05
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多