java - 在矩阵java中找到相等数字的最大区域

标签 java algorithm matrix tree

我有一个任务。我需要找到具有相同数量的最大区域(例如,按行或列的邻居)。我制作的程序运行良好,但问题是如果我有以下矩阵:

{ 1, 3, 2, 2, 2, 4 } 
{ 3, 1, 3, 2, 4, 4 }
{ 4, 3, 1, 2, 3, 3 }  
{ 4, 3, 1, 3, 3, 1 }  
{ 4, 3, 3, 3, 1, 1 }

程序将打印 10。好吧,也许你们中的一些人会说这是因为我将 1 添加到最终结果,是的,这是真的,但是如果我不添加 1,并且如果位置 [1][1 ] 是 3 而不是 1,我会得到 12 女巫是错误的,所以这就是我加 1 的原因。所以我的问题是你对优化算法有什么建议吗..如果是的话,我将非常感谢听到他们:)..

这是我的代码:

protected  int counter = 0;
    protected  int max = 1;
    protected enum eState {
        Vi,
        InPr,
        Unvi
    };

    public void recNodeMatrix(int i, int j, eState st[][],int [][]matr,int n,int k) {

        st[i][j] = eState.InPr;

        for (int r = 0; r < n; r++) {
            for (int c = 0; c < k; c++) {
                if ((matr[i][j] == matr[r][c]) 
                        && ((((i+j) - (r + c)) == 1) || (((i+j) - (r + c)) == -1))
                        && ((st[r][c] == eState.Unvi))) { 
                    counter++;
                    recNodeMatrix(r, c, st,matr,n,k); 
                }
            }
        }
        st[i][j] = eState.Vi;
    }


    public  void Zad17() {

        int n=5,k=6;
        eState st[][] = new eState[n][k];

        int[][] matr = new int[][] {
                { 1, 3, 2, 2, 2, 4 },
                { 3, 1, 3, 2, 4, 4 },
                { 4, 3, 1, 2, 3, 3 },
                { 4, 3, 1, 3, 3, 1 },
                { 4, 3, 3, 3, 1, 1 } };



        for (int i = 0; i < n; i++) {
            for (int j = 0; j < k; j++) {
                st[i][j] = eState.Unvi;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < k; j++) {
                if(st[i][j] == eState.Unvi) {
                    recNodeMatrix(i, j, st,matr,n,k);
                    if(max<counter)
                        max=counter;
                    counter =0;
                }
            }
        }


        System.out.print(max+1);
    }

最佳答案

解决这个问题的最好方法可能是使用联合查找数据结构:https://en.wikipedia.org/wiki/Disjoint-set_data_structure

最初,每个单元格都是它自己的集合,然后您合并每对相邻单元格中具有相同数字的集合。

完成后,答案就是最大集合的大小。由于无论如何您都必须跟踪集合大小,因此请使用按大小并集而不是按等级并集。

运用一点小聪明,您可以仅使用一组 N*K 整数来实现联合查找——每个单元一个。每个整数要么是父集的索引,要么是根的 -size。

这在大约线性时间内解决了问题,并且在实践中可能比使用类似内存量的洪水填充解决方案更快。

关于java - 在矩阵java中找到相等数字的最大区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48885967/

相关文章:

java - 如何在preparedstatement中使用JDBC通配符创建mysql表

java - 受另一个泛型限制的泛型类型

r - 矩阵过滤一次返回矩阵,另一次仅返回一个向量

python - 用 numpy tensordot 进行张量乘法

java - 图像图标不显示

java - GridView 图像宽度和高度

algorithm - 求解Ω和Θ(O,Omega和Theta表示法)

algorithm - Dcg状态算法实现

sql - 在SQL语句中查找递归和

java - 添加和乘以二维矩阵