【问题标题】:How to improve performance while calculating matrix sum如何在计算矩阵和时提高性能
【发布时间】:2019-12-03 19:18:59
【问题描述】:

我在一次面试中得到了一个任务,给了我一个矩阵,现在我需要使用下面的公式从中生成另一个矩阵:

给定矩阵A[R][C],生成B[R][C]

val = 0;
for (i = 0; i ≤ xPosition; i += 1) {
    for (j = 0; j ≤ yPosition; j += 1) {
        val = val + a(i, j);
    }
}

B(xPosition,yPosition) = val;

我想出了以下代码:

public List<List<Integer>> generate(List<List<Integer>> A) {
        List<List<Integer>> top = new ArrayList<>();

        for (int i = 0; i < A.size(); i++) {
            List<Integer> inner = new ArrayList<>();
            for (int j = 0; j < A.get(0).size(); j++) {
                inner.add(generateValue(A, i, j));
            }
            top.add(inner);
        }
        return top;
    }

    int generateValue(List<List<Integer>> A, int xPosition, int yPosition) {
        int val = 0;
        for (int i = 0; i <= xPosition; i++) {
            for (int j = 0; j <= yPosition; j++) {
                int value = A.get(i).get(j);
                val += value;
            }
        }
        return val;
    }

示例输入:

1 2 3
4 5 6

输出:

1 3 6
5 12 21

如何提高这个逻辑的性能?

【问题讨论】:

  • 嗨!我认为您的问题在这里是题外话,但在 Code Review 网站上的主题。
  • 您是否发送了您的代码?考虑雇用你的公司会怎么想你寻求帮助?
  • @MicheleDorigatti,这是几天前被问到的,我只是想知道我在解决这个简单的逻辑时哪里出错了。
  • 重新计算每个元素的值

标签: java algorithm matrix


【解决方案1】:

从数学上来说,你在数组 b 中的解决方案,每个元素都与它的前一个元素相关。

要改进您的代码/优化它,您需要查看这种关系。 所以对于每个 B[i][j] 都与它的前一个元素和数组 A 中的值相关。

下面是数学解,

b[i][j] = b[i-1][j] + a[i][0]+a[i][1] + a[i][2]+...+a[i][y-1] 

因此,如果您能够实现这一点,您的代码将通过所有测试用例

我不是java开发者,但是如果你想要代码,我可以用python写给你

【讨论】:

    【解决方案2】:

    关键是把这看作一个动态规划问题,假设我们已经计算了B[x][y]对于所有0 &lt;= x &lt; i0 &lt;= y &lt; j,当我们去计算B[i][j]时。

    B[i][j] 包含A 的子矩阵中从0, 0 开始到i, j 结束的所有元素的总和。因此B[i-1][j] 将包含此子矩阵中所有元素的总和除了ith 行中的元素。同样,B[i][j-1] 将包含此子矩阵中所有元素的总和,除了jth 列中的元素。将这两者相加,我们得到子矩阵中除元素A[i][j] 之外的所有元素的总和。然而,在这样做的时候,我们计算了从0, 0i-1, j-1 的所有元素两次,并且我们必须减去它们的总和(即B[i-1][j-1])一次,这样我们总共只求和一次。然后我们添加缺少的元素A[i][j]。因此

    B[i][j] = B[i-1][j] + B[i][j-1] - B[i-1][j-1] + A[i][j]
    

    现在可以将这种递归实现为O(RC) 动态编程算法。

    为了帮助进一步理解这一点,请考虑下图表示我们必须为其找到元素总和的子矩阵。该图是一个矩阵C[i][j],其中x, yth 元素是我们对A[x][y]求和的次数。对于C[i][j],我们的最终目标(B[i][j])是

    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    

    B[i-1][j]对应矩阵C[i-1][j],即

    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    0 0 0 0 0
    

    B[i][j-1]对应矩阵C[i][j-1],即

    1 1 1 1 0
    1 1 1 1 0
    1 1 1 1 0
    1 1 1 1 0
    

    B[i-1][j] + B[i][j-1]对应矩阵C[i-1][j] + C[i][j-1],也就是

    2 2 2 2 1
    2 2 2 2 1
    2 2 2 2 1
    1 1 1 1 0
    

    B[i-1][j] + B[i][j-1] - B[i-1][j-1]对应矩阵C[i-1][j] + C[i][j-1] - C[i-1][j-1],也就是

    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 0
    

    现在B[i-1][j] + B[i][j-1] - B[i-1][j-1] + A[i][j]对应

    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    1 1 1 1 1
    

    B[i][j]相同。

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2022-12-11
      • 2018-10-09
      • 2017-07-05
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多