我写了一个小代码,将地图上的地板区域聚类。它运作良好,但是我想优化计算时间。 您有什么建议可以减少计算时间吗?
优化算法的想法是对簇仅使用一个矢量,并且仅对所有像素进行一次遍历。
该算法的工作方式如下:它扫描从左上角开始的所有单元格,然后逐行分析每一行。如果检测到一个小区为楼层,它会分析左侧的邻居并定义其中一个邻居是否属于集群。如果是这种情况,则分配相同的群集号,否则,分配一个新的群集号。如果两个邻居的簇号不同,则它们将通过“替换”操作合并在一起。
std::vector<int> PathPlanning::clustering(){
const int unknown = -1;
int clusterCount = 0;
std::vector<int> clusters(m_map.size(), unknown);
for (size_t i = 0; i < clusters.size(); ++i) {
if(m_map.at(i) != e_mapState::FLOOR)
continue;
for(auto& nb : neighborLeft(i)) {
if(clusters.at(nb)!= unknown){
if(clusters.at(i) == unknown){
clusters.at(i) = clusters.at(nb);
}else{
std::replace (clusters.begin(), clusters.end(), clusters.at(nb), clusters.at(i));
}
}
}
if(clusters.at(i) == unknown){
clusterCount+=1;
clusters.at(i) = clusterCount;
}
}
return clusters;
}
答案 0 :(得分:0)
这看起来像一个disjoint set问题,实际上每个元素的运行时间为O(α(n)),O(1),因此O(nα(n)),O(n )。
您的代码是O(n个邻居n),n个用于循环,另外n个用于替换。
还有一些Boost code可用,因此您可以节省一些实施时间。