2011-03-27 142 views
1

我有二维int数组如下二维数组和

{0.2,0.0,0.3,0.0,0.0} 
{0.4,0.1,0.0,0.0,0.9} 
{0.0,0.0,0.0,0.3,0.6} 

我希望得到以下输出

{0.6,0.0,0.3,0.0,0.0} 
{0.6,0.1,0.0,0.0,1.5} 
{0.0,0.0,0.0,0.3,1.5} 

如果你分析一下,我和每一列的非零值,并更新所有具有该总和值的非零值。例如,在第一列I中求和(0.2 + 0.4 = 0.4)并将两个值位置更新为0.6。

我正在使用Java,我该如何执行此操作?它是一个简单的例子,实时我有非常大的数组。

回答

1

这项工作假设他们都是相同的长度。特殊情况是对读者的练习。

class MatTest { 
    static void makeSums(float[][] floats) { 
     // we wouldn't be doing any operations on these inputs anyway, so return 
     if(floats == null || floats.length == 0 || floats.length == 1) return; 

     // check to make sure it's retangular 
     for(float[] arr : floats) { 
      if(arr.length != floats[0].length) { 
       throw new IllegalArgumentException("makeSums() requires rectangular array"); 
      } 
     } 

     for(int i = 0; i < floats[0].length; i++) { 
      // do each column 
      float sum = 0f; 
      for(int j = 0; j < floats.length; j++) { 
       sum += floats[j][i]; 
      } 
      for(int j = 0; j < floats.length; j++) { 
       if(floats[j][i] != 0) floats[j][i] = sum; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     float[][] floats = new float[3][5]; 
     floats[0] = new float[] {0.2f,0.0f,0.3f,0.0f,0.0f}; 
     floats[1] = new float[] {0.4f,0.1f,0.0f,0.0f,0.9f}; 
     floats[2] = new float[] {0.0f,0.0f,0.0f,0.3f,0.6f}; 

     makeSums(floats); 

     for(int i = 0; i < floats.length; i++) { 
      for(int j = 0; j < floats[0].length; j++) { 
       System.out.print(floats[i][j]); 
       System.out.print(" "); 
      } 
      System.out.println(" "); 
     } 
    } 
} 

下面是它的结果:

C:\Documents and Settings\glow\My Documents>javac MatTest.java 

C:\Documents and Settings\glow\My Documents>java MatTest 
0.6 0.0 0.3 0.0 0.0 
0.6 0.1 0.0 0.0 1.5 
0.0 0.0 0.0 0.3 1.5 
+0

谢谢,有些时候简单的事情可能需要你一整天:-) – Tweet 2011-03-27 23:40:06

+0

添加了一些特殊情况。 – corsiKa 2011-03-27 23:46:41

1

让我们叫你输入数组float[][] a并初始化为全零并行输出数组b

float curSum = 0.0; 
first = true; 
for(int i = 0; i < a[0].length; i++) 
{ 
    for(int j = 0; j < a.length; j++) 
    { 
     if(a[i][j] != 0) 
     { 
      if (first) 
      { 
       for(int k = j; k < a.length; k++) 
        curSum += a[i][k]; 
       first = false; 
      } 
      b[i][j] = curSum; 
     } 
    } 
    curSum = 0.0; 
    first = true; 
} 

有可能是你必须改变,比如浮标和东西比较一些细微之处,但我认为这个想法是所有有

我认为它运行在O(N * M) ,而且看起来不太好,但我试图尽可能缩短迭代次数。我没有看到任何更快的方式来做到这一点。即使tho有三个for循环,k的循环只会运行一次,每循环一次,渐近地它不会增加复杂性。

+0

谢谢:-)竖起大拇指 – Tweet 2011-03-27 23:43:53