Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
求矩阵java中等数的最大面积_Java_Algorithm_Matrix_Tree - Fatal编程技术网

求矩阵java中等数的最大面积

求矩阵java中等数的最大面积,java,algorithm,matrix,tree,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,我会得到1

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

{ 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);
    }
受保护整数计数器=0;
受保护的int max=1;
受保护的enum遗产{
不及物动词,
InPr,
志愿人员方案
};
公共无效recNodeMatrix(内部i、内部j、房地产街[][]、内部[][]材料、内部n、内部k){
st[i][j]=eState.InPr;
对于(int r=0;r如果(max可能解决此问题的最佳方法是使用union find数据结构:

最初,每个单元格都是它自己的集合,然后合并每对相邻单元格中数量相等的集合

完成后,答案是最大集合的大小。由于您必须始终跟踪集合大小,请使用按大小并集,而不是按秩并集

只要稍微聪明一点,就可以用一个N*K整数数组实现联合查找——每个单元格一个整数。每个整数要么是父集合的索引,要么是根的-size


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

从任何单元格开始,整体填充其周围区域,在进行过程中标记您访问的单元格(例如,通过布尔标志或反转单元格的符号),显然忽略了已经访问过的单元格或具有不同编号的单元格。@meowgoesthedog的评论提供了正确答案。但是,我只想补充一点,您的代码非常慢,因为每次扫描整个网格以查找相邻单元格时,实际上只应检查4(或8)个单元格相邻单元格。您的复杂度为O(N^2.K^2),而前面提到的优化使其为O(N.K)。这是一个深度优先搜索如何有帮助的示例(前面注释的泛洪填充表示在asense中)从一个单元格(i,j)开始通过dfs搜索等值单元格,每次搜索时,记录覆盖的最大单元格数。