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