减少聚类算法的计算时间

时间:2018-06-26 14:08:54

标签: c++ optimization cluster-analysis

我写了一个小代码,将地图上的地板区域聚类。它运作良好,但是我想优化计算时间。 您有什么建议可以减少计算时间吗?

优化算法的想法是对簇仅使用一个矢量,并且仅对所有像素进行一次遍历。

该算法的工作方式如下:它扫描从左上角开始的所有单元格,然后逐行分析每一行。如果检测到一个小区为楼层,它会分析左侧的邻居并定义其中一个邻居是否属于集群。如果是这种情况,则分配相同的群集号,否则,分配一个新的群集号。如果两个邻居的簇号不同,则它们将通过“替换”操作合并在一起。

   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;
    }

1 个答案:

答案 0 :(得分:0)

这看起来像一个disjoint set问题,实际上每个元素的运行时间为O(α(n)),O(1),因此O(nα(n)),O(n )。

您的代码是O(n个邻居n),n个用于循环,另外n个用于替换。

还有一些Boost code可用,因此您可以节省一些实施时间。

相关问题