我有以下问题定义并以有效的方式进行搜索(已找到一种肮脏的方式):
我有一组带有整数ID的对应关系,例如:
(0,9) (1,5) (9,2) (2,3)
我想要的是一组数组,所有数组都包含连接的对应数据,在我的例子中将是
(0,9,2,3) (1,5)
我的数据集非常大,所以我需要它非常高效,最好用C ++和tbb。 我目前做了什么,有什么用(但实际上是缓慢和单线程):
struct point
{
std::set<size_t> others;
};
std::map<size_t, point> globalList;
//globalList is filled with input data set, for my example:
globalList[0].others.insert(0);
globalList[0].others.insert(9);
globalList[1].others.insert(1);
globalList[1].others.insert(5);
globalList[9].others.insert(9);
globalList[9].others.insert(2);
globalList[2].others.insert(2);
globalList[2].others.insert(3);
bool changed;
do
{
changed = false;
for (auto it1 = globalList.begin(); it1 != globalList.end(); ++it1 )
{
for (auto it2 = it1 ; it2 != globalList.end(); ++it2 )
{
if (it2 == it1 )
continue;
auto findIt = it2->second.others.find(it1->first);
bool merge = false;
if( findIt != it2->second.others.end())
{
merge = true;
}
else
{
for( auto otherIt = it1->second.others.begin(); otherIt != it1->second.others.end(); ++otherIt )
{
findIt = it2->second.others.find(*otherIt );
if (findIt != it2->second.others.end())
{
merge = true;
break;
}
}
}
if(merge )
{
it1->second.others.insert(it2->second.others.begin(), it2->second.others.end());
auto it2remove = it2;
--it2;
globalList.erase(it2remove );
changed= true;
}
}
}
} while (changed);
}`
任何建议,提示(算法链接,例如提升)或实施都会很棒......
答案 0 :(得分:0)
看起来像找到树中最长的路径。你怎么用循环?我会尝试使用树或图表存储您的项目。
答案 1 :(得分:0)
你想要做的基本上是找connected components in a graph。在您的情况下,您从一组边开始(每对是边)。
There is for example the boost graph library, which has an implementation.
答案 2 :(得分:0)
您正在寻找联盟查找或 Disjoint Set Data Structure
可以找到的高效教程3>}。