让我们说应用程序需要有效地存储大量洗牌的套牌。是否存在恒定空间,恒定时间的算法,以便:
index = draw_from_shuffled(element_count, number_of_draws_made, random_seed)
返回的值是从排序集中绘制的下一张卡的索引。此外,索引不会重复,即:同一张卡不会被抽出两次。存储大量不同洗牌的卡座的需要将被替换为随机数,该随机数提供一种初始化矢量,其中订购该组卡。存储n
个洗牌后的套牌,需要存储n
个整数值。
这样的算法存在吗?没有固定时间的一种方法是使用bloom filter来跟踪已经绘制的卡片。数据要求是不变的,但最坏情况的算法复杂度为n!
,这是不可取的。
答案 0 :(得分:2)
保持52个整数的数组,其中每个项目是所有套牌中相应卡片的总数(索引1表示心脏中的1个,而项目最初为1000个卡片的1000个)。在绘图功能中:
选择0到1之间的随机值R.
将T设为0
对于数组中的每个项目:
3-A。设T = T + item / totalItems
3-b中。如果T> = R递减项目,则递减totalItems,返回项目索引
3-C。转到3
假设甲板数量适合整数,该算法具有恒定的空间和恒定的运行时复杂度。或许更确切地说,空间复杂度为O(logD)
。