纸牌游戏,使用过的牌回到牌组,但没有插入底部,但是在牌组的下半部分随机位置。
如给出了卡牌[c5, c6, c7, c8, c9]
下一个pop
操作应该返回c5
,并且在使用c5
之后,应该将其重新插入到下半部分的牌组中,
即在c8
之前或之后c8
或之后c9
您如何为此套牌设计有效的数据结构?
卡数量不变
答案 0 :(得分:3)
如果卡的数量实际上总是52,那么数组就会产生精细的数据结构。由于元素的数量是恒定的,所有操作都是恒定的时间。在现代系统中,连续存储位置中的移动元素非常快。使用更复杂的数据结构,您将很难做得更好。
如果卡的数量可以随意变化,我建议an order statistic tree。在这样的树中,每个节点跟踪子树中作为根的节点的数量。这使得能够在任何顺序位置插入和移除。实际上,这为您提供了一个数组,其中插入和删除是O(log n),树是平衡的。
很高兴,因为你是随机重新插入的,如果你最初为套牌创建一个平衡的树,你可以获得预期的O(log n)性能“免费”。如果你想要最坏情况O(log n),你可以让树自我平衡(红黑,AVL等)。
要从牌组顶部进行处理,请移除位置0.要重新插入,请在0-51中选择一个随机数,然后插入该序号位置。