2016-05-13 70 views
-2

我必須做一個程序,添加一個二維數組的列並返回最小的總和。這是我編寫的程序,但我想知道是否有更有效的方法。主要課程是由教授給我們的。我想知道是否有辦法做到這一點,而不必爲每列聲明一個整數,因爲如果它不總是3列,謝謝。如何在C++中總結二維數組中的列?

#include <iostream> 
    #include <string> 
    using namespace std; 

    int smallCol(int x[][3], int row, int col){ 

    int c1 = 0; 
    int c2 = 0; 
    int c3 = 0; 
    int min; 

    for (int r = 0; r < row; r++){ 
     for(int c = 0; c < col; c++){ 
      if(c==0) 
       c1 += x[r][c]; 
      if(c==1) 
       c2 += x[r][c]; 
      if(c==2) 
       c3 += x[r][c];  

      } 


     } 

    min = c1; 

    if(c2 < c1) 
     min = c2; 

    if(c3 < c2) 
     min = c3; 

    return min;  
} 


    int main() { 
    int x[2][3] = {{3, 1, 4}, {1, 5, 9}}; 
    cout << "Smallest column sum is " << smallCol (x, 2, 3) << endl; 
    // from the 2-d array x that has size 2 x 3, find the smallest col sum 
    // output will be 4 since col#0 contains 3 and 1 is smallest. 
    return 0; 
    } 
+0

需要多長時間才能支持,哦,說2d陣列與100列?這是一個相對較小的2D陣列,你知道的。 –

回答

2

如果切換嵌套循環只能使用一個變量:

#include <limits> 

int smallCol(int x[][3], int row, int col){ 

    int min = std::numeric_limits<int>::max(); 
    // or something really big... like 2147483647 

    for (int c = 0; c < col; ++c) { 
     int sum = 0; 
     for(int r = 0; r < row; ++r) { 
      sum += x[r][c]; 
     } 
     if (min > sum) { 
      min = sum; 
     } 
    } 
    return min;  
} 

編輯

如果因爲它的分配不能修改程序的主體結構,您可以使用矢量來存儲部分總數,然後掃描它以找到最小值:

std::vector<int> sums(col); 

for (int r = 0; r < row; ++r) { 
    for(int c = 0; c < col; ++c) { 
     sums[c] += x[r][c]; 
    } 
} 
for(int c = 0; c < col; ++c) { 
    if (min > sums[c]) { 
     min = sums[c]; 
    } 
} 

由於內存中元素的連續性,這對於非常大的矩陣可能更容易緩存,從而導致更快的代碼。

+0

在列之前迭代行幾乎總是會使代碼非常慢(我已經看到10倍或更多),因爲緩存問題。 – RyanP

+0

@RyanP當然,但我們正在談論一個小二維數組... –

+0

同意了,因爲它並不是很大。我只是在考慮「我想知道是否有更有效的方法」,「因爲如果它不總是3列」,並且不想讓他覺得找到一種方法來處理1變量它更好/更高效。 – RyanP

2

更改嵌套循環的順序,因此您首先遍歷列並計算該列中所有行的總計。然後你不需要每列的總數的變量。

int min; 
for (int c = 0; c < col; c++) { 
    int total = 0; 
    for (int r = 0; r < row; r++) { 
     total += x[r][c]; 
    } 
    if (c == 0 || total < min) { 
     min = total; 
    } 
} 

c == 0測試使得第一列被特殊處理,所以它初始化min從第一列中的總。其餘列將與此相比較。

+0

那麼,至少我們是以不同的方式初始化'min' ...;) –

0
int smallCol 
{ 
    auto min = std::numeric_limits<int>::max(); 

    for (auto i = 0; i < col; ++i) 
    { 
     auto m = std::accumulate(x, x + row, 0, [i](int sum, auto && row) { return sum + row[i]; }); 
     if (m < min) min = m; 
    } 

    return min; 
}