【发布时间】:2016-01-18 16:49:20
【问题描述】:
纸牌游戏,用过的纸牌回到牌组,但不插入底部,而是在牌组第二半的随机位置。
例如给定一副牌[c5, c6, c7, c8, c9]
下一个pop 操作应该返回c5,并且在使用c5 之后,它应该在第二半内重新插入到卡组中,
即在c8 之前或c8 之后或c9 之后
你会如何为这套牌设计一个高效的数据结构?
卡片数量不变
【问题讨论】:
-
我能想到的最好的就是一个基于链表的栈,但是对于每个pop来说这将是O(n)(因为这里的pop实际上是一个pop+insert)
-
弹出将是 O(1),因为我可以将 ref 保持在头部,但插入到中间将是 O(n)
-
没错,在这里,因为 pop 将是 pop+insert,所以 O(1)+O(n) :(
-
为了进一步优化插入,他可以保留一个指向堆栈中间的指针,并在执行弹出时将其向前移动,然后从该指针开始插入查找。它会将插入更改为 O(n/2),仍然是 O(n),但从技术上讲要快一些。
标签: data-structures