【发布时间】:2012-06-03 04:12:44
【问题描述】:
我正在寻找一种数据结构来保存唯一元素的无序集合,这将支持以下操作
- 在集合中任意位置插入/删除元素
- 查询元素是否存在
- 访问随机元素
天真地,1 和 2 建议使用关联容器,例如unordered_set,但是 3 在元素数量上是线性的。使用随机访问容器,例如vector,使 3 变得容易,1 可以在 O(1) 中完成,但是 2 又是 O(N)。
问题是是否有一种已知的方法可以解决这种线性复杂性?
编辑:通过 3 中的随机元素,我的意思是:给定 N 个元素的任意顺序,检索元素编号 j,其中 j 介于 0 和 N-1 之间。对于std::vector,它只是下标,对于std::list 或std::set,它从begin() 等开始将列表/集迭代器递增j 次。
【问题讨论】:
-
通过哪个键访问随机元素?如果它是无序的,那么它就不能是索引——这意味着 std::set 或 std::hash_map 或类似的。
-
@lezebulon:对于 std::set 3 仍然是 O(N),不是吗?
-
不,应该是 O(logn)。
std::set使用红黑树实现。 -
@RogerLipscombe:通过索引,是的。给定 N 个元素的任意顺序,我想得到一个元素编号 j,其中 j 是从 0 到 N-1 的整数。
-
如果你想要一个“无序集合”,插入和删除“集合中的任何位置”没有多大意义。
标签: c++ data-structures