Algorithm 在三维二进制矩阵中查找相邻单元组

Algorithm 在三维二进制矩阵中查找相邻单元组,algorithm,3d,matrix,Algorithm,3d,Matrix,我想在矩阵中找到一组相邻的单元格 例如,让我们考虑下面的一个2D矩阵。 在给定的矩阵中,有两组相邻的单元格,其值1: 以下是查找这些组的一种方法: 为值为1的第一个单元格指定一个不同的值:比如说a。然后检查与A相邻的值为1的单元格,并将这些单元格中的值设置为A。以这种方式搜索,直到找不到更多的连续单元格 在下一步中,将A增加到B,并从值为1的单元格开始。然后按照上面相同的步骤操作 这是一种蛮力,在3D中不会有效。有没有人知道我可以用哪种算法稍加调整 或者这个问题的任何简单解决方案?您试图做的

我想在矩阵中找到一组相邻的单元格

例如,让我们考虑下面的一个2D矩阵。

在给定的矩阵中,有两组相邻的单元格,其值
1

以下是查找这些组的一种方法:

  • 为值为1的第一个单元格指定一个不同的值:比如说
    a
    。然后检查与
    A
    相邻的值为
    1
    的单元格,并将这些单元格中的值设置为
    A
    。以这种方式搜索,直到找不到更多的连续单元格

  • 在下一步中,将
    A
    增加到
    B
    ,并从值为
    1
    的单元格开始。然后按照上面相同的步骤操作

  • 这是一种蛮力,在3D中不会有效。有没有人知道我可以用哪种算法稍加调整


    或者这个问题的任何简单解决方案?

    您试图做的事情通常都会被贴上标签。我不想再详细说明了,维基百科的文章比我能解释的更好

    但是当我回答的时候

    你和许多其他人似乎认为,对数组中所有元素的简单迭代(你用贬义词“暴力”来形容)是一件无论如何都要避免的事情。现代计算机非常非常快。按顺序访问数组的每个元素是大多数编译器都可以优化的

    您似乎陷入了这样的思维陷阱:访问3D数组的每个元素在
    O(n^3)
    中都具有时间复杂性,其中
    n
    是数组每个维度上的元素数。它不是:访问数组的元素是在
    O(n)
    中,其中
    n
    是数组中的元素数


    即使访问数组中每个元素的时间复杂度为
    O(n^3)
    许多提供更好的渐近时间复杂度的复杂算法,在实践中也会证明其性能比简单算法差。许多复杂的算法使得编译器更难优化代码。请记住,
    O(n^2)
    是一类等价的算法,其中包括具有真实时间复杂性的算法,例如
    O(m+k*n^2)
    ,其中
    m
    k
    都是常量

    ,这与在图中查找一样,但整个过程扩展到了三维。因此,您可以对2D图形使用任何线性时间算法,并将DFS也适用于3D。这应该是直截了当的


    由于这些算法是线性时间的,所以在运行时间复杂性方面,您无法获得更好的结果。

    以下是一些用于简单泛洪填充算法的psuedo代码:

    >>> def flood(i, j, matrix):
    ...     if 0 <= i < len(matrix) and 0 <= j < len(matrix):
    ...         if matrix[i][j] == 1:
    ...             matrix[i][j] = 0
    ...             for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
    ...                 flood(i + dx, j + dy, matrix)
    
    >>> count = 0
    >>> while True:
    ...     i, j = get_one(matrix)
    ...     if i and j: #found a one
    ...         count += 1
    ...         flood(i, j, matrix)
    
    def洪水(i、j、矩阵): ... 如果0>计数=0 >>>尽管如此: ... i、 j=获得一个(矩阵) ... 如果我和j:#找到了一个 ... 计数+=1 ... 洪水(i、j、矩阵)
    Um,对于连接的组件标签,具有最佳时间复杂度的复杂算法(即,使用不相交的集合数据结构来获得
    O(输入大小*InverseAccermann(输入大小))
    性能)可以变得非常快,是一种实用的选择方法。也就是说,我同意在这里抱怨“蛮力“需要读取整个输入。如果问题只是想找到一个连接的组件,那么它应该已经回答了自己。但是,如果目标是找到所有连接的组件,那么您需要查看整个输入…谢谢各位。是的,你是对的,我不想用暴力来贬损。。我只是想探索是否还有其他方法。谢谢你们,谢谢你们,罗伯特。最终使用了3D的洪水填充算法。到目前为止,我实现了洪水填充,它正在做我需要做的事情。因此,我将勾选此作为答案。谢谢。太棒了,你能解释一下你的算法和方法吗。我问这个是为了学习。谢谢。搜索“深度优先搜索”、“广度优先搜索”、“洪水填充”和“联合查找”,或者尝试以下方法:所有搜索都应该是O(V+E)=O(NM+4NM)=O(NM)。最好的方法是遍历矩阵的单元格,如果以前未找到单元格,则执行DFS。是。我看过强连接组件。他帮我解决了一些问题。谢谢你。