在算法上跟踪大量洗牌的牌组

时间:2013-12-16 03:43:20

标签: algorithm math complexity-theory

让我们说应用程序需要有效地存储大量洗牌的套牌。是否存在恒定空间,恒定时间的算法,以便:

 index = draw_from_shuffled(element_count, number_of_draws_made, random_seed)

返回的值是从排序集中绘制的下一张卡的索引。此外,索引不会重复,即:同一张卡不会被抽出两次。存储大量不同洗牌的卡座的需要将被替换为随机数,该随机数提供一种初始化矢量,其中订购该组卡。存储n个洗牌后的套牌,需要存储n个整数值。

这样的算法存在吗?没有固定时间的一种方法是使用bloom filter来跟踪已经绘制的卡片。数据要求是不变的,但最坏情况的算法复杂度为n!,这是不可取的。

1 个答案:

答案 0 :(得分:2)

保持52个整数的数组,其中每个项目是所有套牌中相应卡片的总数(索引1表示心脏中的1个,而项目最初为1000个卡片的1000个)。在绘图功能中:

  1. 选择0到1之间的随机值R.

  2. 将T设为0

  3. 对于数组中的每个项目:

    3-A。设T = T + item / totalItems

    3-b中。如果T> = R递减项目,则递减totalItems,返回项目索引

    3-C。转到3

  4. 假设甲板数量适合整数,该算法具有恒定的空间和恒定的运行时复杂度。或许更确切地说,空间复杂度为O(logD)