[英]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))
find
和count
方法(它們進行二進制搜索) 。
因此,您可以簡單地執行以下操作:
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.