2013-04-17 103 views
1

代碼:總結一個2維數組

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

什麼是好?

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

爲什麼?

+0

什麼語言? (我猜C?) –

+0

你似乎不明白2D數組是如何工作的。 a [n]表示「由n索引的數組」,a [n] [m]表示「在n處索引的數組的位置m處的索引值」,所以除非我們談論某些特定情況,否則這些不是互換。 –

+0

@David Robinson.Yes。但是,您使用的是哪種語言? – Eagle

回答

2

鑑於您有一個平方數組(列數=行數)的事實,運行時間/結果沒有差異。

sum+=a[i][j]; 

Ex。

1 2 3 
4 5 6 
7 8 9 

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

這一個通過從第一行開始,就加入它的每一個數字的總和是不言而喻到下一行後,使之和。

sum + = a [j] [i];

Ex。

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];最終結果將是相同的,但總和將以另一種方式創建。

編輯由於新的信息:

知情自己一些關於時間複雜度和實際上有一個小的時間差,由於cache.Accessing數據存儲器,併攏比得更快的是相距甚遠所以[i] [j]會比[j] [i]更好。

爲了看到那些你需要使用巨大的n作爲數組大小的區別。

+0

感謝您的幫助。我喜歡你的編輯回答我的問題:D – Eagle

0

作爲一般規則,在處理多維度時,爲了自己的理智,我嘗試保持字母順序。 I.E:

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

有道理,但表現仍然存在差異。這就是我總是這樣做的。但是,您還必須記住一個程序的性能 – Eagle

1

就目前而言,確實沒有什麼區別。如果你關心矩陣的總和(例如2維數組),它應該沒關係。最後你會得到相同的金額。如果我們假設你使用「i」掃描行,「j」掃描列,那麼如果你做「sum + = a [i] [j]」,你會得到「一個時間「,如果你做了」sum + = a [j] [i]「,那麼它將成爲一次一列。

因此,如果你不關心中介子支付,但總和是你所關心的,那就沒有對錯的方式,或者更好或更壞的方式。 「sum + = a [i] [j]」雖然更容易閱讀和理解。