【问题标题】:Search first appearence in matrix under time complexity demands在时间复杂度要求下搜索矩阵中的首次出现
【发布时间】:2020-03-31 08:31:42
【问题描述】:

我需要为一个算法编写一个伪代码,该算法将矩阵 (n x m) 作为输入并输出第一次出现的 0 的行索引

我应该描述两种算法,其中一种在 O(mlogn) 中执行,另一种在 O(m+n) 中执行

矩阵的特殊属性:
该矩阵仅由 0 和 1 组成。
输入零值后,该单元格下方的所有同一列也需要为零。

有效输入示例:

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

输出应该是:1

编辑:我能够想出一个 O(mlogn) 的算法。

【问题讨论】:

    标签: algorithm matrix data-structures time-complexity


    【解决方案1】:

    第一种算法 O(m*log(n))

    在列内,值按降序排序。这意味着您可以通过在列内使用二分搜索找到O(log(n)) 中的第一个0

    m 列可供搜索。这导致O(m*log(n)) 在所有列中搜索它们的第一个0。在这些m 结果中找到第一个0O(m),它被先前搜索的O(m*log(n)) 支配。

    第二种算法 O(m+n)

    第二个算法从(n,m) 的单元格开始。对于每一列,从最后一列开始,我们在一个带有0 的单元格上时向上。当我们点击1 时,我们会移至上一列。

    i <- n
    j <- m
    r <- (-1, -1)
    while (j >= 0):
      if M(i,j) == 1:
        j <- j-1
        continue
      while (i >= 0 && M(i,j) == 0)
        r <- (i,j)
        i <- i-1
    

    最后结果在r或者根本没有结果和r = (-1,-1)

    【讨论】:

    • 如果我正确理解了第二种算法,它会说:从右下角的单元格开始。如果值为 1,则向左跳过一个单元格 如果值为 0,则向上跳过一个单元格,直到超出范围。我描述的对吗?
    • 当有0时,你会向上超过一个单元格。
    【解决方案2】:

    编辑:这个答案是针对不包括矩阵的特殊属性

    的旧问题

    我认为不可能提出在最坏情况下性能优于 O(mn) 的算法。

    这是一个简单的解决方案,它检查矩阵的每个元素。

    def solve(mat, n, m):
       for i in range(1, n):
          for j in range(i, m):
             if mat[i][j] == 0:
                return i
    
       return -1
    

    在最坏的情况下(例如输入矩阵中没有 0 时):

    外部 for 循环将运行 n 次,对于每次迭代,内部 for 循环将运行 m 次。

    所以总的时间复杂度将是 O(m * n)

    【讨论】:

    • 对于我的要求有一个解决方案(它是 Uni 作业的一部分)。这并不能解决我的问题。
    • 问题是否提到每一行都已排序?如果行是排序的,我们可以在 O(m*log(n)) 中解决它,我们可以进一步改进它到 O(m + n)。如果你愿意,我可以详细描述这个方法。
    • 矩阵没有完全排序,但有一个规则,我解释得不好,编辑了帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多