繁体   English   中英

二维阵列的深度优先搜索

[英]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数组),哪种方法将有助于我改进此算法?

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可能会产生更好的算法。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM