【问题标题】:Find areas in matrix..?在矩阵中查找区域..?
【发布时间】:2010-07-02 13:45:25
【问题描述】:

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

我想获得一种算法,该算法可以非常快速地(如果必要的话很脏)找到这些“1”的“巢”。在这里,它不应该“分割”两个每周连接的“巢”。

知道我应该如何做这样的算法吗?

【问题讨论】:

    标签: matrix flooding


    【解决方案1】:

    也许像 A* 这样的寻路算法(或者像 BFS 或 DFS 这样更简单的算法)可能适用于这种情况。

    你可以:

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

    【讨论】:

      【解决方案2】:

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

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

      如果给定一个点,您希望找到同一块中的所有元素,flood fill 将是合适的。然后,您可以在找到每个巢穴时对其进行缓存,当您获得另一个点时,首先查看它是否在已知巢穴中,如果不是,则执行洪水填充以找到该巢穴,然后将其添加到缓存中。

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

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

      【讨论】:

        【解决方案3】:
        1. 将矩阵变成黑白位图
        2. 缩放矩阵,使大小为 N 的嵌套变为单个像素(因此,如果您寻找 10x10 的嵌套,则缩放 N=10 倍)。
        3. 使用输出的剩余像素来定位巢。使用中心坐标(乘以上述因子)在矩阵中定位相同的嵌套。
        4. 使用低通滤波器去除所有连接巢穴的“管道”。
        5. 在位图上使用对比滤镜找到巢的边界。
        6. 创建不包含嵌套的位图(即将嵌套的所有像素设置为 0)。
        7. 使用加宽单个像素的滤镜来扩大巢穴的轮廓。
        8. 按位AND输出7和5得到所有管道的连接点。
        9. 跟随管道,看看它们是如何连接巢穴的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 2015-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          相关资源
          最近更新 更多