二维阵列的深度优先搜索

时间:2019-03-13 12:05:14

标签: java algorithm search data-structures stack

我有一个像这样的数组:

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

我想将元素“ 1”分组。

所以您看到我通过使用堆栈获得了经典的dfs。问题是,如果我具有上述矩阵,该算法的时间复杂度是多少,其中n是矩阵元素的数量。 (行*列)。如果它比O(N)差(因为我必须遍历整个2D数组),哪种方法将有助于我改进此算法?

2 个答案:

答案 0 :(得分:1)

O(n * log n)算法的示例

(其中 n 是矩阵元素的数量)

算法的思想如下。

  1. 通过将所有矩阵元素添加到其中来初始化未处理元素 U 的树集
  2. U 尚未为空时,请从 U 中获取任何 u 并检查其值
    • 如果 u ='0',则将其删除,即 U := U \ {u}
    • 如果 u ='1',则开始探索 DFS(u,U)


 其中过程 DFS(u,U)使用矩阵探索 u 的'1'邻居。

但是,出现问题的是 DFS(u,U)还会从 U 中删除所有发现的元素。


很容易理解并证明该算法确实总是以O(n * log n)完成。从树集中删除元素具有最坏情况的复杂度O(log n)。每个 DFS(u,U)运行最多可以访问 | U | 元素,并且通过任何方式访问的每个元素都将从 U 中删除,如下所示:执行进度。当 U 为空时,算法终止。

简短摘要

例如,可以通过在每个元素上运行DFS来生成 O(n ^ 2)算法,而不管您先前获得的知识如何。 使用任何机制确保不在已发现的组/岛上运行DFS可能会产生更好的算法。

很抱歉,我无法直接分析您自己的算法,但这可能会帮助您自行完成。

答案 1 :(得分:0)

您需要设计的算法的下限应该是O(m+n)-我正在考虑将行数和列数分别设置为mn。这是因为无论如何您都需要遍历整个2D数组。如果使用两个for循环解决此问题,则也将使用O(m+n)。对于矩阵中的每个元素,您都将与其他四个相邻元素进行比较,因此,总体检查大小为<= 4mn

我认为没有比O(m+n)时间更好的方法来解决这个问题了。

请注意,在您的问题中,如果您考虑使用m+n = N,那么我指的是O(N)

相关问题