C++ 用迭代法求区域最大元素

C++ 用迭代法求区域最大元素,c++,algorithm,C++,Algorithm,假设我会在下面的矩阵中找到区域最大元素。区域最大值是8个具有相同值t的连通元素,其外部边界均小于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;

假设我会在下面的矩阵中找到区域最大元素。区域最大值是8个具有相同值t的连通元素,其外部边界均小于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);
    }
}
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]);
        }
    }
}

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

据我所知,您可以创建使用和标记组件,但这些组件不是最大的

伪代码:

for (i = 0; i < 10; i++) {
    for (j = 0; j < 6; j++) {
        if element(i, j) > AllOfNeighbors(i, j)
            RecordMaxElementIndex(i, j);
    }
}
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]);
        }
    }
}
DisjointSet DisjointSet[10][6]
//初始不相交集
对于(i=0;i<10;i++){
对于(j=0;j<6;j++){
不相交集[i][j].MakeSet({i,j});
disjointSet[i][j].MarkAsMaximal();//您的案例的额外标志
}
}
//创建连接的组件并标记为“非最大”
对于(i=0;i<10;i++){
对于(j=0;j<6;j++){
用于(自动邻接点集:具有相同值(i,j)的邻接){
并集(不相交集[i][j],邻域点集);
}
if(元素(i,j)<任何一个相邻元素(i,j)){
不相交集[i][j].MarkAsNotMaximal();
}
用于(自动邻接点集:具有最小值(i,j)的邻接点){
neightardisjointset.MarkAsNotMaximal();
}
}
}
//收集结果。
std::设置最大区域;
对于(i=0;i<10;i++){
对于(j=0;j<6;j++){
if(不相交集[i][j].IsMarkAsMaximal){
最大区域。插入(不相交集[i][j]);
}
}
}

我不清楚(
自动邻接点集:具有相同值(I,j)的邻接点集)是什么意思{
你能给出更多解释吗?我将尝试重新表述:对于具有相同值的每个邻接点坐标,使用该坐标的断开集。因此对于第一种情况:
(0,0)
的值是
1
,和
(1,0)
(0,1)
也有
1
作为值,但
(1,1)
作为不同的值(
2
)。因此
邻域点集
将迭代
断开集[0][1]
断开集[1][0]
。关于
MakeSet()
还有一件事要问:
MakeSet()
是初始化父节点,所以这里我首先得到60个父节点。然后将它们合并(
Union()
)到几个分区中,这些分区是8连接的,并且共享相同的值。我说得对吗?是的,连接的组件是连接的,最后共享相同的值。