繁体   English   中英

Java中的连接组件标签

[英]Connected Component Labeling in Java

我正在尝试实现一种方法,该方法将查找给定大小的组数。 输入是一个n×n二维数组,其中每个像元的值为0或1。如果像元在水平或垂直方向上相邻(而不是对角线)并且都具有一个,则认为它们在同一组中。值1。
组大小是该组中的单元数。 与二维数组一起,还传递了整数“ t”的数组。 对于每个整数t [i],函数应确定大小等于该值的组数。 该信息以整数数组“ answer”返回。
我试图解决此问题,但未能通过所有提供的测试用例,而我看不到这些输入或输出。 我尝试了许多自定义测试用例,但没有发现任何问题。 有什么情况下我的功能无法正常运行?

static int[] countGroups(int[][] m, int[] t) {

    int[] answer;
    answer = new int[t.length];
    Arrays.fill(answer, 0);
    int[] sizes;
    int length = m.length;
    sizes = new int[(length * length)];
    Arrays.fill(sizes, 0);
    int[] subList;
    subList = new int[length * length];
    Arrays.fill(subList, 0);
    int groupID = 2;

    for(int j = 0; j < length; j++){
        for(int k = 0; k < length; k++){
            if(m[j][k] > 0){
                if((j != 0) && (k != 0)){
                    if((m[j-1][k] > 0) && (m[j][k-1] > 0)){
                        if(m[j-1][k] != m[j][k-1]){
                            if(m[j-1][k] < m[j][k-1]){
                                subList[(subList[(m[j][k-1])])] = m[j-1][k];
                                subList[(m[j][k-1])] = m[j-1][k];
                                m[j][k] = m[j-1][k];
                            }
                            else{
                                subList[(subList[(m[j-1][k])])] = m[j][k-1];
                                subList[(m[j-1][k])] = m[j][k-1];
                                m[j][k] = m[j][k-1];
                            }
                        }
                        else{
                            m[j][k] = m[j-1][k];
                        }
                    }
                    else if(m[j][k-1] > 0){
                        m[j][k] = m[j][k-1];
                    }
                    else if(m[j-1][k] > 0){
                        m[j][k] = m[j-1][k];
                    }
                    else{
                        groupID++;
                        m[j][k] = groupID;
                    }
                }
                else if((j == 0) && (k == 0)){
                    m[j][k] = groupID;
                }
                else if(k != 0){
                    if(m[j][k-1] > 0){
                        m[j][k] = m[j][k - 1];
                    }
                    else{
                        groupID++;
                        m[j][k] = groupID;
                    }
                }
                else if(k == 0){
                    if(m[j-1][k] > 0){
                        m[j][k] = m[j-1][k];
                    }
                    else{
                        groupID++;
                        m[j][k] = groupID;
                    }

                }
            }
            else{
            }
        }
    }
    for(int j = 0; j < length; j++){
        for(int k = 0; k < length; k++){
            if(m[j][k] > 0){
                if(subList[(m[j][k])] > 0){
                    m[j][k] = subList[(m[j][k])];
                }
            }
        }
    }
    for(int j = 0; j < length; j++){
        for(int k = 0; k < length; k++){
            if(m[j][k] > 0){
                sizes[(m[j][k])]++;
            }
        }
    }
    for(int x = 0; x < t.length; x++){
        for(int n = 0; n < sizes.length; n++){
            if(sizes[n] == t[x]){
                answer[x]++;
            }
        }
    }
    return answer;
}

问题分为两部分:

1)确定群体

2)计算每组的大小

问题1)需要稳定器算法:

  • 给每个单元格一个唯一的值
  • 对于每对相邻的单元格,将值最高的一个更改为相邻单元格的(较低)值
  • 重复以上操作,直到不再发生更改为止

然后问题2变得相当简单,它只是所有出现值的频率表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM