我需要编写一个RandomQueue,以允许在恒定时间(O(1))中进行追加和随机删除。
我的第一个想法是使用某种Array(我选择ArrayList)来支持它,因为数组可以通过索引进行恒定访问。
虽然查看文档,但我意识到ArrayLists的添加被视为摊销固定时间,因为添加可能需要重新分配基础数组O(n)。
摊销的固定时间和固定时间实际上是否相同,还是我需要查看某种结构,不需要每次添加都进行完全重新分配?
我之所以这样问是因为除了基于数组的结构(据我所知,它将始终具有摊销的固定时间),我想不出任何满足要求的东西:
- 任何基于树的事物最多都具有O(log n)访问权限
- 链表可能会增加O(1)(如果保留对尾部的引用),但是随机删除最多应为O(n)。
这是完整的问题;万一我对一些重要细节感到困惑:
设计并实现一个RandomQueue。这是Queue接口的一种实现,其中remove()操作将删除一个元素,该元素是在队列中当前所有元素中随机选择的。(将RandomQueue当作一个包,我们可以在其中添加元素或进入并盲目删除一些随机元素。)RandomQueue中的add(x)和remove()操作每个操作应在恒定的时间内运行。
1/a
机会进行O(n)运算),但是增长一个常数因数a > 1
是将O(1)摊销以进行加法:我们有(1/a)^n
一个O 的机会(n)运算,但大的概率接近零n
。