从另一组整数中有效地删除一组整数
Efficient removal of a set of integers from another set
我有一组(大)整数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_difference
算法与std::set
没有太大关系。它适用于您可以按顺序迭代的任何内容。无论如何,它不是用于就地修改容器。由于在这种情况下T.size()
很小,因此您真的不希望每次删除一批元素时都创建一个新容器。在另一个结果集足够小的示例中,它将比重复erase
更有效。
C++库中的set_difference具有O(|S|)
的时间复杂度,因此它不适合您的目的,因此我建议您使用 S.erase() 删除 S 中的 set 元素O(logN)
实现为 BST。因此,您的时间复杂度降低到O(NlogN)
相关文章:
- 在 c++ 中拥有一组结构的正确方法是什么?
- 如何从一组具有从左到右优先级的整数值创建有序整数键?
- 编写所需的代码以创建动态一维整数数组
- 我如何将一组整数集变成C 中的3D矢量
- 给定一组正整数 <=k 及其 n 个子集,找到哪些子集对给出原始集合的并集
- 如何将字符串形式的日期 ( "Dec 25, 2012" ) 转换为一组整数 (12/25/12)?
- 最长的子序列,其元素构成一组递增的整数
- 如何查找具有一组整数的函数的'max absolute sum'
- C++将一组整数变量映射到值的有效方法
- 在C++中生成一组整数的排列.获取分段错误
- 给定一组 12 个整数,如何递归生成所有可能的 4 组 3 个整数?C++
- 从另一组整数中有效地删除一组整数
- 按变量数组中的列将一组整数从文本文件读入
- 保存一组整数的最佳方法
- 计算一组关系的整数映射的更有效的算法
- 如何将一维整数数组从 QML 发送到C++
- 我需要标记一组匹配的整数,以便用分数进行数学检查
- 如何在C++中添加一组整数
- 将一组整数读取为C++中的字符串
- 如何在c++中创建一组非标准顺序的整数