在矩阵中查找区域..?

时间:2010-07-02 13:45:25

标签: matrix flooding

假设我有一个非常大的矩阵,10000x10000个元素的值都为'0'。可以说有一些'1'的大“巢”。这些区域甚至可能是连接的,但是每周都通过'1'的'管道'连接。

我希望得到一种非常快速的算法(如有必要,可以弄脏)找到'1'的'巢'。在这里,它不应该“分割”两个每周连接的'巢'。

知道我应该怎么做这样的算法吗?

3 个答案:

答案 0 :(得分:1)

在这种情况下,像A*这样的寻路算法(或者像BFS或DFS这样简单的东西)可能会起作用。

你可以:

  • 通过查找小巢(忽略管道)来搜索搜索的起点..所以至少有1x3的3x3块
  • 那么你应该从那里经过1路直到你结束矩阵内的“连接组件”(诗歌许可)
  • 从另一个小的1块开始重复

答案 1 :(得分:0)

我想说这取决于如何需要数据。如果给出两点,你需要检查它们是否在1的同一块中,我认为@Jack的答案是最好的。如果您对块最初的位置有所了解,也是如此,因为您可以将它们用作算法的起点。

如果您没有任何其他信息,可能有其中一种可能:

如果给定一个点,您希望找到同一个块中的所有元素,flood fill是合适的。然后你可以在找到它时缓存每个嵌套,当你得到另一个点时,首先看看它是否在一个已知的嵌套中,如果它没有进行泛洪填充以找到这个嵌套,那么将它添加到缓存中。

作为一个实现细节,当您遍历矩阵时,每一行应该具有前一行中存在的一组嵌套。然后你只需要检查那些巢穴而不是整套的新点,以确定新点是否在已知的集合中。

如果可以处理概率效应,请确保使用具有极低查找成本的集合实现,例如哈希表或可能是Bloom过滤器。

答案 2 :(得分:0)

  1. 将矩阵转换为黑色和白色位图
  2. 缩放矩阵,使N大小的巢成为单个像素(因此,如果您查找10x10个巢,则按N = 10的比例缩放)。
  3. 使用输出的剩余像素来定位巢穴。使用中心坐标(乘以上面的系数)在矩阵中定位相同的嵌套。
  4. 使用低通滤波器去除连接巢穴的所有“管道”。
  5. 使用位图上的对比滤镜找到嵌套的边框。
  6. 创建一个不包含嵌套的位图(即将嵌套的所有像素设置为0)。
  7. 使用加宽单个像素的滤镜来增大巢的轮廓。
  8. 按位AND输出7和5以获取所有管道的连接点。
  9. 按照管道查看它们如何连接巢穴