从std :: list中删除重复项的最快方法

时间:2012-03-22 23:59:06

标签: c++ sorting stl

如果有人问过,请原谅我,我找不到。 我有一个自定义类型,我可以实现(模糊)相等但没有<运算符是可传递的。 比较成本很高,但我的元素并不多。 我需要找出几乎相同的多边形(它们重叠到很大一部分)。由于缺少传递实现,因此使用<进行排序是不可能的,我使用的std :: list如下所示:

typedef std::list<Polygon> PolyList;
PolyList purged(rawList);
for (PolyList::iterator iter= purged.begin(); iter!=  purged.end(); ++iter) {
  for(PolyList::iterator toRemove = find(boost::next(iter),purged.end(),*iter); toRemove != purged.end(); ){
      PolyList::iterator next = purged.erase(toRemove);
      toRemove = find(next,purged.end(),*iter);
    }
  }

复杂度是n * n / 2,这在我看来是不可避免的 虽然算法工作正常,但读取和写入仍然非常麻烦,我几乎可以肯定有一个标准的算法,我只是不知道,或者至少有一些快速但更整洁的类型。正如我所说,由于数据的模糊性,排序不是一种选择,因此没有唯一的设置或排序。 非常感谢提前帮助我

2 个答案:

答案 0 :(得分:3)

你可能不会在标准中找到一个asnwer,因为你的“重复”听起来像它们也不是传递的。这就是说a==b && b==c并不意味着a==c

仅凭这个原因,任何算法都必须比较所有对,这会给你(N*N-1)/2比较(假设你的相等是对称的,即a==b 暗示{{1 }})。

答案 1 :(得分:1)

我怀疑是否有一个'标准算法'来实现你想要的东西,但如果你定义一个描述两个多边形之间差异的距离度量,那么你可以选择(任何)一个多边形(称之为基本多边形)并排序距离该多边形的所有其他距离。只有与基部的距离相似的多边形可以彼此相似。

现在,您只需要在决定要删除的多边形时考虑具有相似距离的多边形组。没有证明 - 我怀疑证据可能涉及 - 我相信这是N log N。