给定布尔矩阵X,令0项代表海洋,1项代表陆地。将一个岛定义为垂直或水平(但不是对角线)相邻的1个条目。
最初的问题是计算给定矩阵中的孤岛数量。作者描述了一个递归解(内存)。
但是我没有尝试找到一种流式处理(从左到右,然后向下到下一行)的解决方案,该解决方案可以动态地计算具有或O(n )或O(n + m )内存的岛(没有限制)时间复杂度)。那可能吗?如果没有,我该如何证明?
该count
功能某些输入的预期输出的一些示例:
给定布尔矩阵X,令0项代表海洋,1项代表陆地。将一个岛定义为垂直或水平(但不是对角线)相邻的1个条目。
最初的问题是计算给定矩阵中的孤岛数量。作者描述了一个递归解(内存)。
但是我没有尝试找到一种流式处理(从左到右,然后向下到下一行)的解决方案,该解决方案可以动态地计算具有或O(n )或O(n + m )内存的岛(没有限制)时间复杂度)。那可能吗?如果没有,我该如何证明?
该count
功能某些输入的预期输出的一些示例:
Answers:
这是一个算法的示意图,该算法一次只在内存中保留两行,因此内存为。但是,由于您可以在矩阵转置上运行此算法而没有问题,因此实际的复杂度是O (min (m (n ,n )))内存。处理时间为O (m n )。
初始化。扫描第一行,找到该行的所有连接的子字符串。为每个不相交的子字符串分配一个唯一的正ID,并将其另存为一个零向量(其中为零,否则为唯一的正ID)。
对于剩余的每一行,请再次为该行中的子字符串分配唯一ID(切勿重新分配以前的唯一ID,请确保您的ID严格增加)。以 x m矩阵查看上一行和当前行,并且应将任何连接的区域分配为最小。举个例子:
无需为该算法的正确性更新前一行,只需更新当前一行即可。
完成之后,找到上一行中未连接到下一行的所有ID的集合,并丢弃重复项。将此集合的大小添加到岛屿的运行计数器中。
现在,您可以舍弃上一行,并将当前行分配给上一行,然后继续。
为了正确处理最后一行,假装在的底部还有另一行零,然后再次运行步骤2。