2016-05-13 73 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; 
}