1
39
你可以用
|
2
2
第一个解决方案: O(log n) 及时/ O(1) 在太空中(不统一!)
在上面的评论中假设的,可以在
O(log(n))
(vs)
o(n)
对于
本质上,你:
注意:正如 亚伦 未选择元素 均匀地 随意地。您需要构建与集合中的元素分布相同的随机元素,以实现统一的轮询。 第二种解决方案: O(1) 及时/ o(n) 空间(统一)戴维高 已经用向量给出了解决方案,但有一个问题,因为当 流行音乐 作为堆栈的一个元素,必须在 o(n) 或者你可以在每次你想要检索一个随机元素的时候重建你的向量,但是那是 o(n) 也是。
要避免此问题并将插入/删除保持为
O(log n)
,您可以保留
P.S:如果您的元素很大,那么可以使用一组无序的指针(使用修改过的哈希表)来释放一些内存。 |
3
2
如果随机访问很重要,并且您可以使用o(n)平均插入工作量,那么 this paper 可能很方便。
这里的主要思想是使用排序向量,然后查找函数
最后,问题的要点是:随机访问是O(1)。
画一个随机数
这里是本文的代码基础,它实现了这个排序向量。根据需要进行扩展:
对于更复杂的实现,您还可以考虑 this page .
编辑:或者更好,使用
|
4
1
这是一种方法,虽然不漂亮; |
5
0
C++ 17
这将是一种方便的方法,尽管不是非常有效(o(n))的方法:
但我认为,为了提高效率,你只需要复制到另一种结构: How to select a random element in std::set in less than O(n) time? |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |