簡體   English   中英

如何優化std :: set交集算法(C ++)

[英]How to optimize a std::set intersection algorithm (C++)

我正在為大學工作的一部分苦苦掙扎。 我有兩個std :: set容器子集,其中包含指向相當復雜的對象的指針,但是按不同的標准排序(這就是為什么我不能使用std::set_intersection() )。 我需要盡快找到兩個子集中包含的元素。 分配有時間/復雜性要求。

通過執行以下操作,我可以在n*log(m)時間內完成操作,其中n是第一個子集的大小, m是第二個子集的大小:

for(auto it = subset1.begin(), it != subset1.end(), it++){
    if(find(subset2.begin(), subset2.end(), *it))
        result.insert(*it);
}

這沒有滿足時間要求,時間要求說最壞的情況是線性的,但平均水平好於線性。

我在這里發現以下問題 ,並且發現哈希表方法很有趣。 但是,我擔心散列表的創建可能會導致過多的開銷。 集合中包含的類如下所示:

class containedInSets {
   //methods
private: 
    vector<string> member1;
    SomeObject member2;
    int member3;
}

我無法控制SomeObject類,因此無法為其指定哈希函數。 我必須對指針進行哈希處理。 此外,向量可能會相當大地增長(成千上萬個條目)。

最快的方法是什么?

您的代碼不是O(n log(m))而是O(n * m)

std::find(subset2.begin(), subset2.end(), *it)是線性的,但是std::set具有在O(log(n)) findcount方法(它們進行二進制搜索) 。

因此,您可以簡單地執行以下操作:

for (const auto& e : subset1) {
    if (subset2.count(e) != 0) {
        result.insert(e);
    }
}

它的復雜度為n*log(m)而不是您的n * m

暫無
暫無

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

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