【问题标题】:Choose a random element from a set in O(1) time [duplicate]在O(1)时间内从集合中选择一个随机元素[重复]
【发布时间】:2020-09-13 23:13:47
【问题描述】:

我想在 O(1) 时间内从 python 集合中选择一个随机元素(均匀分布)。这可能吗?我已经看到它建议首先将集合转换为列表,然后从列表中选择随机元素,但这将花费 O(n) 时间,其中 n 是集合的大小。如果这不可能,有什么比较快的替代方案?

【问题讨论】:

  • 您可以使用字典并保持键和值相同,然后调用random.choice。你的用例是什么——需要一套吗?据我所知,我认为没有办法比 O(n) 做得更好,但也许我错了,因为直觉上看起来应该没问题。
  • 我认为你不能从 O(1) 的集合中随机选择。使用列表似乎是一种合理的方法。除非你的集合很大,否则这似乎不是问题。
  • Time complexity,来自 Python 维基
  • 如果你真的需要一套数据结构,有许多第三方orderedset 实现可用——参见PyPi,应该可以从支持索引。另见Does Python have an ordered set?
  • 您是否尝试拥有一种数据结构来公开类似集合的操作以及random() 一种?

标签: python set time-complexity


【解决方案1】:

我认为不可能从哈希表中获取随机元素(如何实现集合),因为它不支持随机访问。 random.choice 出于这个原因需要随机访问。 set.pop 有一个不错的选择,但它似乎并不统一(请参阅 https://github.com/python/cpython/blob/master/Objects/setobject.c#L616)。

只要它在紧密循环中对性能不是很重要,转换为列表应该没问题。但是,如果它确实很重要,也许您可​​以首先考虑使用不同的数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2020-10-30
    • 2019-02-26
    • 2012-01-23
    • 2014-06-19
    相关资源
    最近更新 更多