布尔矩阵中的孤岛计数


9

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

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

但是我没有尝试找到一种流式处理(从左到右,然后向下到下一行)的解决方案,该解决方案可以动态地计算具有On On + 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

    010402220333300506607080009990010402220333300504402020003330

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

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

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

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


6

ØñØñ日志ññ=Ωñ

X1个Xñÿ1个ÿñ一世X一世=ÿ一世=1个2×2ñ-1个X1个0X200Xñÿ1个0ÿ200ÿñ一世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.