合并连接索引对的最佳算法

时间:2016-10-13 05:37:38

标签: c++ algorithm performance sorting merge

我有以下问题定义并以有效的方式进行搜索(已找到一种肮脏的方式):

我有一组带有整数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);
}`

任何建议,提示(算法链接,例如提升)或实施都会很棒......

3 个答案:

答案 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

可以找到的高效教程}。