假设我在下面的矩阵中找到区域最大元素。区域最大值是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)
进行比较。那么如何实现迭代方法呢?任何指南都会有所帮助。
答案 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]);
}
}
}