簡體   English   中英

從自定義類型的std :: list中刪除重復項的最快方法

[英]Fastest way to remove duplicates from std::list of a custom type

如果之前已被問到,請原諒我,我找不到。 我有一個可以實現(模糊)相等性的自定義類型,但是沒有<可傳遞的<運算符。 比較是昂貴的,但是我沒有很多元素。 我需要整理出完全相同的多邊形(它們有很大一部分重疊)。 由於缺少可傳遞的實現,因此使用<排序是不可能的,所以我使用了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,這在我看來是不可避免的,盡管算法運行良好,但讀寫仍然非常麻煩,而且我幾乎可以肯定有一種標准算法,我只是不知道或不知道至少速度快,但打字要整潔。 正如我所說的,由於數據的模糊性,排序不是一種選擇,因此沒有唯一的集或排序。 在此先感謝您對我的幫助

您可能不會在Standard中找到提升方法,因為您的“重復項”聽起來也不是可傳遞的。 那就是說a==b && b==c並不意味着a==c

僅出於這個原因,任何算法都必須比較所有對,這將為您提供(N*N-1)/2比較(假設您的相等性是對稱的,即a==b 確實意味着b==a )。

我懷疑是否有一種“標准算法”來實現所需的功能,但是如果您定義描述兩個多邊形之間差異的距離度量,那么您可以選擇(任意)一個多邊形(稱為基礎多邊形)並對所有其他多邊形進行排序在距該多邊形的距離上。 只有距底面距離相似的多邊形才可能彼此相似。

現在,在決定刪除哪些多邊形時,只需要考慮具有相似距離的多邊形組即可。 沒有證明-我懷疑可能涉及證明-我相信這是N logN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM