【发布时间】:2019-03-25 03:11:54
【问题描述】:
所以,我遇到了一个使用 getRandomElement() 函数构建集合的问题。乍一看很容易。但是我越想这个,我就越觉得不可能在 O(1) 时间复杂度内做到这一点。对恒定时间没有给定要求,但所有集合的主要功能都是在恒定时间内完成的,所以我觉得它暗示这也应该在恒定时间内完成。
集合的目标是让散列函数减少冲突。现在的问题是,如果你只是生成随机整数并尝试使用这个随机整数选择索引,你很可能会在你的集合中遇到一个“空”槽......在这种情况下,你必须生成一个新的随机数然后再试一次。本质上,您的散列函数越好,您的 getRandomElement 使用这种方法执行的效果就越差。
然后我想...好吧,为什么不在每次插入后存储索引?然后,生成一个随机数并从该索引集合中选择一个索引。我认为这是一个好主意,但随之而来的是删除元素的问题。我们还必须从我们的索引列表中删除相应的索引,以及从我们的集合中删除元素本身。我们怎样才能找到正确的索引来删除比线性时间更快的任何东西???
无论如何,从一组 FEELS 中获取一个随机元素可以在比线性时间更好的时间内完成。顺便说一句,我正在通过链接处理碰撞。我不想浪费时间尝试做数学上不可能的事情,但我也不是数学家,我不想放弃实际上可能的事情。
【问题讨论】:
-
不太清楚你的问题是什么。 使用 getRandomElement() 函数构建集合 究竟需要什么?展示一些(伪)代码并解释它的行为如何不令人满意。
-
我不一定有问题。我的问题本质上是可以比线性时间更快地完成随机元素。我真的不需要代码,或者问题的编码解决方案。
-
所以你想从给定的集合中获取一个随机元素,而不是用任何东西构建一个集合。那是一个正确的措辞吗?
-
所以我们可以随心所欲地构建这个集合。它只需要支持集合的基本功能,还需要有一个 getRandomElement 函数。从理论上讲,您应该能够插入、删除等。getRandomElement 应该从先前插入的集合中返回一个随机元素。
-
哦,您想构建一个支持集合操作和 getRandomElement 操作的数据结构,速度比线性时间快,对吗?
标签: algorithm hashmap time-complexity hashset