【发布时间】:2010-07-02 13:45:25
【问题描述】:
假设我有一个非常大的矩阵,其中包含 10000x10000 个元素,所有元素的值都为“0”。可以说有一些“1”的大“巢”。这些区域甚至可能是相连的,但每周都会通过一个 '1' 的“管道”相连。
我想获得一种算法,该算法可以非常快速地(如果必要的话很脏)找到这些“1”的“巢”。在这里,它不应该“分割”两个每周连接的“巢”。
知道我应该如何做这样的算法吗?
【问题讨论】:
假设我有一个非常大的矩阵,其中包含 10000x10000 个元素,所有元素的值都为“0”。可以说有一些“1”的大“巢”。这些区域甚至可能是相连的,但每周都会通过一个 '1' 的“管道”相连。
我想获得一种算法,该算法可以非常快速地(如果必要的话很脏)找到这些“1”的“巢”。在这里,它不应该“分割”两个每周连接的“巢”。
知道我应该如何做这样的算法吗?
【问题讨论】:
也许像 A* 这样的寻路算法(或者像 BFS 或 DFS 这样更简单的算法)可能适用于这种情况。
你可以:
【讨论】:
我会说这取决于如何需要数据。如果给定两点,您需要检查它们是否在同一块 1 中,我认为@Jack 的答案是最好的。如果您对块的初始位置有所了解,这也是正确的,因为您可以将这些用作算法的起点。
如果您没有任何其他信息,也许其中一种是可能的:
如果给定一个点,您希望找到同一块中的所有元素,flood fill 将是合适的。然后,您可以在找到每个巢穴时对其进行缓存,当您获得另一个点时,首先查看它是否在已知巢穴中,如果不是,则执行洪水填充以找到该巢穴,然后将其添加到缓存中。
作为一个实现细节,当您遍历矩阵时,每一行都应该有前一行存在的嵌套集。然后,您只需针对这些嵌套而不是完整集合检查新点,以确定新点是否在已知集合中。
如果可以处理概率效应,请确保使用查找成本非常低的集合实现,例如哈希表或可能的 Bloom 过滤器。
【讨论】:
AND输出7和5得到所有管道的连接点。【讨论】: