布尔矩阵中的孤岛计数


9

给定布尔矩阵X,令0项代表海洋,1项代表陆地。将一个岛定义为垂直或水平(但不是对角线)相邻的1个条目。ñ×米X01个1个

最初的问题是计算给定矩阵中的孤岛数量。作者描述了一个递归解(内存)。Ø(ñ米)

但是我没有尝试找到一种流式处理(从左到右,然后向下到下一行)的解决方案,该解决方案可以动态地计算具有或O(n )或O(n + m )内存的岛(没有限制)时间复杂度)。那可能吗?如果没有,我该如何证明?Ø(米)Ø(ñ)Ø(ñ+米)


该count功能某些输入的预期输出的一些示例:

CØüñŤ(010111010)=1个;CØüñŤ(101010101)=5;CØüñŤ(111101111)=1个;

CØüñŤ(1111100100010110100011011111)=2

CØüñŤ(101111)=1个


1
1.“正交”是什么意思?您是指连接的组件吗?2.关于矩阵的存储方式,我们可以假设什么?我们是否可以假定它存储在外部存储设备(例如,慢速硬盘)上,以便可以读取所需的任何部分,但是一次读取一个块会更快一些?还是我们以流式方式接收矩阵,一旦收到一点输入矩阵,就再也看不到那一点输入了?
— DW

1
太好了,谢谢。我鼓励您编辑问题以澄清这些问题。如果是流式传输,矩阵的位按什么顺序到达?在一行中从左到右扫描,然后向下到下一行?
— DW

1
请编辑问题以包括所有这些详细信息。评论是短暂的。
— Yuval Filmus

2
并非评论中给出的所有信息都可以在帖子本身中找到。这些信息中的一些至关重要,例如您的流模型。评论可能会消失,因此(并根据社区标准),所有必要的详细信息应构成主要帖子的一部分。
— Yuval Filmus's

1
所需的时间复杂度是多少?
— 恒新

Answers:


4

这是一个算法的示意图,该算法一次只在内存中保留两行,因此内存为。但是,由于您可以在矩阵转置上运行此算法而没有问题,因此实际的复杂度是O (min (m (n ,n )))内存。处理时间为O (m n )。Ø(米)Ø(分(米,ñ))Ø(米ñ)

  1. 初始化。扫描第一行,找到该行的所有连接的子字符串。为每个不相交的子字符串分配一个唯一的正ID,并将其另存为一个零向量(其中为零,否则为唯一的正ID)。X

  2. 对于剩余的每一行,请再次为该行中的子字符串分配唯一ID(切勿重新分配以前的唯一ID,请确保您的ID严格增加)。以 x m矩阵查看上一行和当前行,并且应将任何连接的区域分配为最小。举个例子:2米

    010402220333300506607080009990→010402220333300504402020003330

    无需为该算法的正确性更新前一行,只需更新当前一行即可。

    完成之后,找到上一行中未连接到下一行的所有ID的集合,并丢弃重复项。将此集合的大小添加到岛屿的运行计数器中。

    现在,您可以舍弃上一行,并将当前行分配给上一行,然后继续。

  3. 为了正确处理最后一行,假装在的底部还有另一行零,然后再次运行步骤2。X


6

Ø(ñ)Ø(ñ日志⁡ñ)ñ=米Ω(ñ)

X1个,…,Xñÿ1个,…,ÿñ一世X一世=ÿ一世=1个2×(2ñ-1个)X1个,0,X2,0,…,0,Xñÿ1个,0,ÿ2,0,…,0,ÿñ∑一世X一世∑一世(X一世+ÿ一世)一世Ω(ñ)Ω(ñ)

Ø(ñ)Ø(日志⁡ñ)Ø(ñ)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.