2d数组,所有值都相邻

时间:2015-07-09 15:46:06

标签: algorithm matrix multidimensional-array

我需要一种快速方法来检查2d数组是否完全相邻,这意味着所有值都与其他相同的值相邻。相邻意味着四个主要方向。

This would be an adjacent array
[1 1 2]
[1 2 2]
[3 3 3]

This isn't
[1 2 1]
[1 2 2]
[3 3 3]

This is
[1 2 4]
[1 2 2]
[3 3 3]

到目前为止,我已经尝试了一种O(M * N)方法,我遍历整个数组并检查至少有一个邻居是否是相同的值。我正在寻找一种可能更快的方式。

编辑:刚注意到我的方法甚至无法正常工作。例如:

This should fail (not all of the 1s are adjacent)
[1 2 1]
[1 2 1]
[3 3 3]

所以现在我需要一个实际的算法。

3 个答案:

答案 0 :(得分:1)

因为,我认为,类似的值可以任意相距很远,并且可以采用任何形状,在矩阵中我不知道如何在不首先计算值的连通分量:< / p>

  1. 找到矩阵的connected components labeling
  2. 对于每个矩阵值,请保留其所属的组件标签列表。
  3. 如果任何值已经有与之关联的标签,请停止,矩阵不是&#34;相邻&#34;。如果没有,那么矩阵是&#34;相邻&#34;。

答案 1 :(得分:1)

我想起了Minesweeper游戏。

  1. 外循环:扫描整个阵列(逐行,从左到右)。 这是为了找到内循环的下一个位置。如果我们有 没有从内循环访问这个位置,并且数字在 这个位置还没有被看到,在此开始内循环 位置。如果我们已经看到了这个位置的数字,那么 矩阵不是“相邻的”。

  2. 内循环:查找具有相同编号和标记的所有相邻单元格 他们如访问(扫雷部分)。将此数字记录为 访问并返回外部循环。

  3. 这需要一个布尔矩阵显示“已访问”位置(与正在扫描的数组大小相同)和一个已被“访问”的布尔数字[1..n]列表。

答案 2 :(得分:0)

我只想提一下,你不能创建一个比O(M*N)好的算法(当然这是最坏的情况),因为在最坏的情况下你将不得不访问所有的元素。

正如您所说的O(M*N)算法不适用于所有情况,您可以使用BFS和Time complexity is O(M*N)

解决此问题
if(no.of connected components == no.of distinct elements) {
    return true;
}else{
    return false;
} 

您如何找到连接组件的数量?

     yourFunction(int[][] matrix){
         boolean visited[][];
         for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
               if(!visited[i][j]){
                   BFS(matrix,i,j);
                   connectedComponents++;
               }
            }
         }
         int distinctNumbers = findDistinctNumbers(matrix); // you can write this function easily.
     }
    void BFS(int[][] martix, int i,int j){
         queue<Point> queue = new LinkedList<>();
         queue.add(new Point(i,j));
         while(queue.isEmpty()){
             Point point = queue.poll();
              for each neighbour of point
                  if neighbour is not visited && neighbour value =current point value
                      add neighbour to queue;
         }
    }