C++ 从另一个整数集中有效地删除一组整数

C++ 从另一个整数集中有效地删除一组整数,c++,algorithm,stl,C++,Algorithm,Stl,我有一组(大)整数S,我想运行以下伪代码: set result = {}; while(S isn't empty) { int i = S.getArbitraryElement(); result.insert(i); set T = elementsToDelete(i); S = S \ T; // set difference } 函数elementsToDelete是有效的(在S的初始大小中是次线性的),而T的大小很小(假设它是常数)T可能不再包含S中的整数 是否

我有一组(大)整数
S
,我想运行以下伪代码:

set result = {};
while(S isn't empty)
{
  int i = S.getArbitraryElement();
  result.insert(i);
  set T = elementsToDelete(i);
  S = S \ T; // set difference
}
函数
elementsToDelete
是有效的(在
S
的初始大小中是次线性的),而
T
的大小很小(假设它是常数)
T
可能不再包含
S
中的整数


是否有一种比O(| S | ^2)更快的实现上述功能的方法?我想我应该能够得到O(| S | k),其中k是
elementsToDelete
的时间复杂度。当然,我可以使用
std::set_difference
直接实现上述功能,但我的理解是
set_difference
是O(| S |)

使用
std::set S,您可以执行以下操作:

for (auto k : elementsToDelete(i)) {
    S.erase(k);
}
当然,
erase
的查找是
O(log(S.size())
,而不是您要求的
O(1)
。这可以通过
std::unordered_set
实现,假设没有太多的碰撞(这通常是一个很大的假设,但在特定情况下通常是正确的)


尽管名称不同,
std::set_差异
算法与
std::set
没有太大关系。它适用于任何可以按顺序迭代的对象。无论如何,它不是用于容器的就地修改。因为在这种情况下
T.size()
很小,所以您确实不希望每次删除一批元素时都创建一个新的容器。在另一个例子中,结果集足够小,它比重复的代码>擦除更有效。

< P> C++库中的StIGH差异具有<>代码> o(s s>)/Cuth>的时间复杂度,因此它不适合您的目的,因此我建议您使用S.EraseE.()来删除S中的St:<代码> O(Logn)< /C> >实现为BST。因此,您的时间复杂度降低到
O(NlogN)