我有一个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)]
]
这只是一个合并,这将继续,直到不再可能或直到只有向量留在列表中。
答案 0 :(得分:1)
最快的方法是不相交集算法,如评论中所述。
然而,第一个问题是定位最近的邻居,这是O(N ^ 2),O(N * logN)到O(N)复杂度问题之间的任何地方,取决于其他限制。
如果列表中的坐标不是任意大的,我建议只绘制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;
}
}