如果坐标向量的坐标是另一个坐标,则合并坐标向量

时间:2017-11-03 12:06:01

标签: c++ vector

我有一个vector<vector<coord>> list,类似于:

[
    [(1,0),(1,1)],
    [(0,3),(1,3)],
    [(2,0),(2,1),(3,1)],
    [(2,3),(3,3),(3,2)]
]

我需要将每个矢量与另一个矢量的相邻坐标合并。因此,例如,在上面的向量中,2,0是列表的第一个向量中的1,0的邻居。因此,list[0]list[3]已合并。

将结果保留为:

[
    [(1,0),(1,1),(2,0),(2,1),(3,1)],
    [(0,3),(1,3)],
    [(2,3),(3,3),(3,2)]
]

这只是一个合并,这将继续,直到不再可能或直到只有向量留在列表中。

2 个答案:

答案 0 :(得分:1)

最快的方法是不相交集算法,如评论中所述。

然而,第一个问题是定位最近的邻居,这是O(N ^ 2),O(N * logN)到O(N)复杂度问题之间的任何地方,取决于其他限制。

  • O(N ^ 2) - 没有额外存储的暴力
  • O(N * logN) - 通过delaunay tessellation对点进行分组
  • O(N) - 交易大小加速并分配S [ydim] [xdim]的二维数组/图像

如果列表中的坐标不是任意大的,我建议只绘制2d数组中的所有列表,这使得搜索邻居O(1)问题(每个元素)。此外,当绘制第N个列表并在插入的像素附近遇到1 ..(N-1)的标签时,可以立即将第N个列表与先前插入的列表连接。

然后使用flood-fill或disjoint-set(如this answer

答案 1 :(得分:0)

不幸的是,我无法获得太多帮助。然而,经过一个漫长的夜晚,我找到了答案。它似乎非常低效,而且大多不是很好,但它起作用并提供正确的结果。如果有人可以改进,请这样做。 :)

for(int i = 0 ; i < list.size() ; i++ ){
        for(int j = 0 ; j < list[i].size() ; j++ ){
            // Method that provides a vector of neighboring coordinates
            auto ns = x.findneighbours(list[i][j]);
            for(int k = 0 ; k < ns.size() ; k++ ){
                for(int q = i+1 ; q < list.size() ; q++ ){
                    for(int w = 0 ; w < list[q].size() ; w++ ){
                        if( list[q][w]->id == ns[k]->id ){
                            list[i].insert( list[i].end(), list[q].begin(), list[q].end() );
                            list.erase(list.begin()+q);
                            if(list.size() == 1 ){
                                label = true;
                            }
                        }
                        if(label){
                            break;
                        }
                    }
                    if(label){
                        break;
                    }
                }
                if(label){
                    break;
                }
            }
            if(label){
                break;
            }
        }
        if(label){
            break;
        }
    }