【问题标题】:How to find 3x3 square matrix with maximum sum in bigger rectangular matrix in C#?如何在 C# 中找到较大矩形矩阵中最大和的 3x3 方阵?
【发布时间】:2021-10-24 10:00:42
【问题描述】:

我有大小为 N x M 的矩阵,我想在其中找到具有最大总和且大小为 3 x 3 的较小矩阵。我可以手动对所有元素求和,但在更大的矩阵中这是不可能的,你能指出我吗更好的方法。

【问题讨论】:

  • 这意味着我想要总和最大的 3x3 矩阵。
  • 您可以计算该 3x3 矩阵的索引:[x,y], [x+1,y], [x, y+1], [x+1, y+1] 等等。然后遍历所有可能的子矩阵
  • 到目前为止你做了什么吗?
  • 每个内部矩阵的迭代问题是性能问题?
  • 矩阵可以修改吗?另外,如果多个子矩阵总和相同的最大值会发生什么?

标签: c# matrix multidimensional-array


【解决方案1】:

寻找 Kadane 2D 算法。 我认为这是解决这个问题的最佳解决方案之一

【讨论】:

  • 我去看看
【解决方案2】:

如果我理解问题¯\_(ツ)_/¯

给定

public static int FindStuff(int[,] array)
{
   var largest = 0;
   for (var i = 0; i < array.GetLength(0) - 2; i++)
   for (var j = 0; j < array.GetLength(1) - 2; j++)
   {
      var sum = 0;
      for (var x = i; x < i+3; x++)
      for (var y = j; y < j+3; y++)
         sum += array[x, y];
      if (sum > largest)
         largest = sum;
   }

   return largest;
}

用法

var array = new[,]
{
   {1, 1, 1, 1},
   {1, 2, 3, 4},
   {1, 1, 1, 1},
   {5, 1, 1, 1},
};
Console.WriteLine(FindStuff(array));

结果

16

【讨论】:

  • 很好,我会试试这个
【解决方案3】:

在纯 C# 中,您必须计算所有内部矩阵,您可以使用并行任务加速算法,也可以使用 CUDA,检查内部矩阵的简单解决方案应该如下所示:

public void TestMethod(int[][] matrix)
{
    int largestSum = 0;
    int columnLargestIdx = 0;
    int rowLargestIdx = 0;
    for (int column = 0; column < matrix.Length; column++)
        for (int row = 0; row < matrix[column].Length; row++)
        {
            if (IsBuild3x3Possible(matrix, column, row))
            {
                int sum = CalculateSum(matrix, column, row);
                if (sum > largestSum)
                {
                    largestSum = sum;
                    columnLargestIdx = column;
                    rowLargestIdx = row;
                }
            }
        }
}

public bool IsBuild3x3Possible(int[][] matrix, int column, int row)
{
    var columns = (matrix.Length - column) >= 3;
    var rows = (matrix[column].Length - row) >= 3;
    return columns && rows;
}

public int CalculateSum(int[][] matrix, int column, int row)
{
    int sum = 0;
    for (int i = column; i < column + 3; i++)
        for (int j = row; j < row + 3; j++)
            sum += matrix[i][j];
    return sum;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多