如果有人问过,请原谅我,我找不到。
我有一个自定义类型,我可以实现(模糊)相等但没有<
运算符是可传递的。
比较成本很高,但我的元素并不多。
我需要找出几乎相同的多边形(它们重叠到很大一部分)。由于缺少传递实现,因此使用<
进行排序是不可能的,我使用的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,这在我看来是不可避免的 虽然算法工作正常,但读取和写入仍然非常麻烦,我几乎可以肯定有一个标准的算法,我只是不知道,或者至少有一些快速但更整洁的类型。正如我所说,由于数据的模糊性,排序不是一种选择,因此没有唯一的设置或排序。 非常感谢提前帮助我
答案 0 :(得分:3)
你可能不会在标准中找到一个asnwer,因为你的“重复”听起来像它们也不是传递的。这就是说a==b && b==c
并不意味着a==c
。
仅凭这个原因,任何算法都必须比较所有对,这会给你(N*N-1)/2
比较(假设你的相等是对称的,即a==b
暗示{{1 }})。
答案 1 :(得分:1)
我怀疑是否有一个'标准算法'来实现你想要的东西,但如果你定义一个描述两个多边形之间差异的距离度量,那么你可以选择(任何)一个多边形(称之为基本多边形)并排序距离该多边形的所有其他距离。只有与基部的距离相似的多边形可以彼此相似。
现在,您只需要在决定要删除的多边形时考虑具有相似距离的多边形组。没有证明 - 我怀疑证据可能涉及 - 我相信这是N log N。