我知道這些命令是針對兩個集合的。Set_union/Set_intersect for C++中的兩個以上的集合
請問有沒有簡單,快捷的方式了兩個多套這樣做。
我想我可以用某種循環的這個,但也許有更好的辦法。
謝謝
我知道這些命令是針對兩個集合的。Set_union/Set_intersect for C++中的兩個以上的集合
請問有沒有簡單,快捷的方式了兩個多套這樣做。
我想我可以用某種循環的這個,但也許有更好的辦法。
謝謝
對於並集,如果你會看到其中的M組有將M-1的比較中的最小值。所以,現在我們流行過這個值如果N是所有集合中的項目總數,我們的算法就是O(NM)(忽略它是Big-O表示法的M-1)
我們可以優化的地方是如下所示:如果我們排序最低的元素每個集合的t:現在我們從前面彈出一個,但是從這個集合中,我們只需要在我們新分類的前端插入O(logM)。我們爲每個項目做這個,所以我們的算法是O(N logM)。
請注意,如果你有3個你可能一無所獲。如果你有8個這樣的套裝,它當然可以顯示出收益。
對於集合交叉,我們正在尋找只爲出現在我們所有的值集。如果最小值與最大值相同,我們知道它們都是相同的。我們可以彈出並丟棄較小的值,如果它們不再次插入下一個。如果是這樣,我們添加到我們的結果然後從每個列表中彈出無論哪種方式,我們仍然會有O(N logM)
關於set_union:
如果你的容器是真正的std ::集,你可以通過所有組進行循環,但不使用set_union,你可以選擇集和使用插入(使用其他集合的begin()和end()迭代器)。這樣,你將不是創建許多副本,因爲set_union返回(迭代器)到新創建的集合的副本。如果你不想修改任何集合,你可以創建一個新的集合,並且開始插入所有集合中的所有元素。
如果你不使用集合,你可以臨時創建一個std :: set,使用insert,然後將所有元素插入到你的類型的新容器中。
關於set_intersect:你可以使用擦除,但不使用迭代器,只是通過所有集合,並通過所有元素去,它們包含。但我不太確定使用set_intersect會更快。取決於你有多少套。
希望這有助於(:
如果您正在使用的有序集合(如STL套),你可以一次做工會/交集上所有的人立刻如果他們是普通的臺,我不知道。覺得你可以做的比他們一次一個結合較好。