我遇到了一个问题:构建一个带有getRandomElement()函数的集合。乍一看很简单,但是越想越觉得不可能在O(1)时间复杂度内完成。虽然没有给出恒定时间的要求,但是所有集合主要功能都在常数时间范围内,所以我觉得这也应该在常数时间内完成。
集合的目标是通过哈希函数减少碰撞。现在的问题是,如果你简单地生成随机整数并尝试使用此随机整数选择索引,则最有可能在集合中遇到“空”槽......这种情况下,您必须生成新的随机数并重试。实际上,哈希函数越好,使用这种方法的getRandomElement表现越差。
那么我想...好吧,为什么不在每次插入后存储索引呢?然后,从这些索引中生成一个随机数并选择一个索引。我认为这是个好主意,但是接下来就出现了删除元素的问题。我们还必须从索引列表中删除相应的索引,并从集合中删除元素本身。我们如何更快地找到正确的索引以线性时间之外的时间删除?
总之,从集合中获取随机元素感觉可以在线性时间之外完成。顺便说一下,我正在使用链接解决碰撞问题。我不想浪费时间尝试做数学上不可能的事情,但我也不是数学家,我不想放弃实际上可能实现的东西。