【问题标题】:Identify consecutive repetition in two-dimensional array [C]识别二维数组中的连续重复 [C]
【发布时间】:2011-08-23 19:31:41
【问题描述】:

我有一个如下所示的二维数组:

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

我正在尝试找出一种方法来识别 1 的最长连续链,无论是跨越还是向下。在这种情况下,它从第 4 列第 2 行开始,长度为 4,向下。

我在考虑使用递归,但在跟踪位置时遇到了一些问题,尤其是在遇到 0 时。

到目前为止,我有一些类似的东西(仅用于检查):

main() {
    ...
    for(i = 0; i < n; i++)
      for(j = 0; j < n; j++)
        if (G[i][j] == 1) {
          CheckAcross(i, j, n);
        }
    ...
}

void CheckAcross (int i, int j, int n) {
     if (i < 0 || i >= n || j < 0 || j >= n) return; // outside of grid
     if (G[i][j] == 0 ) return; //0 encountered
     G[i][j] = WordCount + 1;
     CheckAcross(i, j + 1, n);

}

其中G[][] 是包含 1 和 0 的二维数组,n 是行数/列数,i 是行数,j 是列数。

提前感谢您的帮助!

【问题讨论】:

    标签: recursion multidimensional-array backtracking contiguous


    【解决方案1】:

    您当前的答案将花费 O(n3) 时间;要评估单行,请检查每个可能的开始和结束位置(每个可能的 O(n)),并且有 n 行。

    您的算法是正确的,但让我们看看我们是否可以改进运行时间。

    如果我们把它分解成更简单的问题,问题可能会变得更简单,即“这个一维数组中最长的连续 1 链是什么?”。如果我们解决它2n 次,那么我们就有了答案,所以我们只需要将它降低到小于 O(n2) 即可进行改进。

    好吧,我们可以简单地遍历这条线,记住最长的 1 序列的位置(开始和结束)和长度。这需要 O(n) 时间,并且是最优的(如果序列全是 1 或 0,我们必须读取每个元素才能知道最长序列的开始/结束在哪里)。

    然后我们可以在 O(n2) 时间内简单地解决每一行和每一列的问题。

    【讨论】:

    • 如果你想坚持自己的解决方案,你可以通过简单地交换索引来轻松交换行和列,你的实现就完成了。
    【解决方案2】:

    创建一个名为 V 的新 n×n 矩阵。这将为每个单元格存储该单元格处以及 紧接其上方的 1 的数量。这将是 O(n^2)。

    checkAllVertical(int n) {
        V = malloc(....) // create V, an n-by-n matrix initialized to zero
        for(int r=0; r<n; r++) {
          for(int c=0; c<n; c++) {
            if(G[r][c]=1) {
              if(r==0)
                V[r][c] = 1;
              else
                V[r][c] = 1 + V[r][c];
            }
          }
        }
    }
    

    您实际上不需要分配所有 V。一次一行就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2021-10-26
      • 2013-02-05
      • 2016-04-01
      • 2016-10-18
      • 2018-02-23
      相关资源
      最近更新 更多