Data structures 使用哪种数据结构作为具有随机位置插入能力的堆栈?

Data structures 使用哪种数据结构作为具有随机位置插入能力的堆栈?,data-structures,Data Structures,纸牌游戏,使用过的纸牌回到牌组,但不是从底部插入,而是在牌组后半部分的随机位置 例如,给定一副卡片[c5、c6、c7、c8、c9] 下一次pop操作应返回c5,使用c5后,应在下半部分内将其重新插入甲板, 即c8之前或c8之后或c9 您将如何为该组设计有效的数据结构 卡的数量是恒定的如果卡的数量始终是52,那么数组就构成了一个良好的数据结构。因为元素的数量是恒定的,所以所有操作的时间都是恒定的。在现代系统中,连续存储单元中的移动速度非常快。使用更复杂的数据结构,您将很难做得更好 如果卡片的数量可

纸牌游戏,使用过的纸牌回到牌组,但不是从底部插入,而是在牌组后半部分的随机位置

例如,给定一副卡片
[c5、c6、c7、c8、c9]
下一次
pop
操作应返回
c5
,使用
c5
后,应在下半部分内将其重新插入甲板,
c8
之前或
c8
之后或
c9

您将如何为该组设计有效的数据结构


卡的数量是恒定的

如果卡的数量始终是52,那么数组就构成了一个良好的数据结构。因为元素的数量是恒定的,所以所有操作的时间都是恒定的。在现代系统中,连续存储单元中的移动速度非常快。使用更复杂的数据结构,您将很难做得更好

如果卡片的数量可以任意变化,我建议使用一种。在这样的树中,每个节点跟踪它作为根的子树中的节点数。这允许在任意顺序位置插入和删除。实际上,如果树是平衡的,这将为您提供一个插入和删除都是O(logn)的数组

幸运的是,由于您是随机插入的,如果您最初为数据组创建一个平衡树,您将“免费”获得预期的O(logn)性能。如果您想要最坏的情况O(logn),您可以使树自动平衡(红黑、AVL等)


要从甲板顶部进行交易,请移除位置0。若要重新插入,请在0-51中选择一个随机数,并在该顺序位置插入。

我能想到的最好方法是基于链表的堆栈,但对于每个pop,这将是O(n)(因为这里的pop实际上是pop+insert)pop将是O(1),因为我可以保持对头部的引用,但中间的插入将是O(n),在这里,由于pop将是pop+insert,即O(1)+O(n):(为了进一步优化插入,他可以保留一个指向堆栈中间的指针,并在执行pop时将其向前移动,然后从该指针开始插入查找。它会将插入更改为O(n/2),仍然是O(n),但技术上要快一点。插入阵列的随机位置如何为O(1)?我不需要移动位于插入的卡前面的其余卡吗?对于阵列,弹出也是相当棘手的。(卡的数量是恒定的)大O的定义总是与描述输入大小的某个变量有关。如果输入大小不变,则每个操作都是常数时间。弹出操作有多复杂?将所有卡片向上移动1。@变量不是数组大小吗?就像对数组排序一样。如果始终有52张卡片,则数组大小不会改变不同。要想让大O有任何意义,你需要一副任意大小的牌。你是对的,虽然它是O(1),但我正在寻找一个具有恒定数组大小的有效解决方案,因为在数组中移动值有点烦人,而且它不是普通的扑克牌,所以牌的数量相当大