【发布时间】:2018-08-21 15:50:08
【问题描述】:
有没有办法从std::set 中的std::set 或O(log(n)) 中随机选择一个元素
更好O(1)时间?它不需要有一个非常均匀的分布,只是一些相当随机的东西
(虽然显然甚至更好)
看着std::set::extract 似乎很有希望
因为它可能会在恒定时间内将set 分成两半,但我找不到
识别靠近根的节点的好方法,我可以使用node_type 文档
find 没有详细说明。
如果一切都失败了,可以将内容复制到std::map,并使用我认为的随机键
是O(n log(n)) 时间,这会让我摊销O(log(n)) 时间,但这不是首选的解决方案
因为在我什么都不想要的情况下需要一些开销
【问题讨论】:
-
您需要使用
std::set吗?如果你想要随机访问,那么你应该使用提供随机访问的容器。 -
@NathanOliver 是的,
std::set在我的代码的其他地方提供了显着的性能优势,我宁愿不使用不同的容器 -
std::set已经提供了O(ln(n))访问时间。如果你想要O(1),那么你应该使用std::unordered_set。见:stackoverflow.com/questions/181693/…
标签: c++ set random-access