通过迭代方法寻找区域最大元素

时间:2014-07-10 20:00:07

标签: 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; 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)进行比较。那么如何实现迭代方法呢?任何指南都会有所帮助。

1 个答案:

答案 0 :(得分:1)

据我了解,您可以使用connected components创建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]);
        }
    }
}