用迭代法求区域最大元

Finding regional maximum elements by iterative method

本文关键字:区域 迭代      更新时间:2023-10-16

假设我将在下面的矩阵中找到区域最大值元素。区域最大值是具有相同值t的8连通元素,其外部边界值均小于t。在这种情况下,期望的结果是一个等于8的元素和五个等于9的元素。

1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 1 1 1
1 1 2 8 2 2 2 9 1 1
1 1 1 1 2 2 9 9 9 1
1 2 2 2 2 2 2 9 1 1
1 1 1 1 1 1 1 1 1 1

对于第一种情况,由于8是最大的,所以很容易从它的8连通邻居中挑选出8。伪代码:

for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
        if element(i, j) > AllOfNeighbors(i, j)
            RecordMaxElementIndex(i, j);
    }
}

但是对于第二种情况,我感到困惑。这一次9大于它的一些邻居,并且等于其他邻居。伪代码是:

for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
        // Start iteration
        if element(i, j) > AllOfNeighbors(i, j)
            RecordMaxElementIndex(i, j);
        else if element(i, j) > SomeOfNeighbors(i, j) && 
                element(i, j) == TheOtherNeighbors(i, j)
            RecordTheOtherNeighborsIndex(i, j);
        // Jump to the start now
    }
}

例如,当(i, j)(7, 2)时,在下一轮迭代时,将记录(6, 3), (7, 3)(8, 3)的元素。我不确定在这里使用迭代法是否合适,但我认为可以将TheOtherNeighbors(ii, jj)视为element(i, j),重复相同的过程来寻找区域最大值。此外,(6, 3)不能再与(7, 2)(7, 3)(8, 3)进行比较,以免出现无限循环。那么如何实现迭代法呢?任何指南都会有帮助的。

据我所知,您可以使用Disjoint-set_data_structure创建连接的组件,并标记不是最大的组件…

伪代码:

DisjointSet disjointSet[10][6]
// Init disjointSet
for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
         disjointSet[i][j].MakeSet({i, j});
         disjointSet[i][j].MarkAsMaximal(); // extra flag for your case
    }
}
// Create Connected component and mark as not maximal
for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
        for (auto neighborDisjointSet : NeighborsWithSameValue(i, j)) {
            Union(disjointSet[i][j], neighborDisjointSet);
        }
        if (element(i, j) < AnyOfNeighbors(i, j)) {
            disjointSet[i][j].MarkAsNotMaximal();
        }
        for (auto neighborDisjointSet : NeighborsWithSmallValue(i, j) {
            neighborDisjointSet.MarkAsNotMaximal();
        }
    }
}
// Collect result.
std::set<DisjointSet> maximumRegions;
for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
        if (disjointSet[i][j].IsMarkAsMaximal) {
            maximumRegions.insert(disjointSet[i][j]);
        }
    }
}