给出一个空列表。有三种类型的查询1, 2, 3
。
查询1 x
其中x
是一个正整数,表示将数字x
添加到列表中。
查询2 x
表示从列表中删除x
。
查询3
表示打印数组中不存在的最小正整数。
此处x
可以从1
到10^9
,查询次数最多为10^5
。对于大范围的x
,我不能保留一个标记访问整数的布尔数组。我该怎么办?
答案 0 :(得分:0)
关于您的数据有太多未知数,无法在此给出明确的答案。这种方法至少在这些不同的情况之间存在很大差异:
这还取决于您将最常做的哪些操作。
小于1 GB的数据,因此可以在大多数计算机上将其保留为内存中的位数组。但是如果数据集稀疏(上面的情况1和2),您可能需要考虑稀疏数组,或者非常稀疏的集合(情况1),可能是二叉搜索树或最小堆。如果你要经常使用~~x == x
操作,那么堆可能不是一个好主意。
对于案例1,2和4,您可能会考虑range tree。此解决方案的优点是,您可以在对数时间内执行操作2
,只需向左下方查看树,然后查看第一个范围。
如果您不打算进行大量随机插入,也可以将数据结构分页到磁盘。
您还可以考虑使用Bloom filter加快搜索速度,具体取决于您最终选择的数据结构类型。