[英]depth first search with 2D Array
我有一个像这样的数组:
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数组),哪种方法将有助于我改进此算法?
(其中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可能会产生更好的算法。
抱歉,我无法直接分析您自己的算法,但这可能会帮助您自己进行操作。
您需要设计的算法的下限应该是O(m+n)
-我正在考虑将行数和列n
分别设置为m
和n
。 这是因为无论如何您都需要遍历整个2D数组。 如果使用两个for循环解决此问题,则也将花费O(m+n)
。 对于矩阵中的每个元素,您都将与其他四个相邻元素进行比较,因此,总体检查大小为<= 4mn
。
我认为没有比O(m+n)
时间更好的方法来解决这个问题了。
请注意,在您的问题中,如果您考虑m+n = N
那么我指的复杂度是O(N)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.