我有一个像这样的数组:
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数组),哪种方法将有助于我改进此算法?
答案 0 :(得分:1)
(其中 n 是矩阵元素的数量)
算法的思想如下。
其中过程 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)
-我正在考虑将行数和列数分别设置为m
和n
。这是因为无论如何您都需要遍历整个2D数组。如果使用两个for循环解决此问题,则也将使用O(m+n)
。对于矩阵中的每个元素,您都将与其他四个相邻元素进行比较,因此,总体检查大小为<= 4mn
。
我认为没有比O(m+n)
时间更好的方法来解决这个问题了。
请注意,在您的问题中,如果您考虑使用m+n = N
,那么我指的是O(N)
。