Assignment 1-2 :Randomized Queues

分析了下用 linked list 不能保证均摊时间为线性:比如在一开始插入M个元素,然后从后往前删除M个元素,这样需要的均摊时间为 0.5M2/2M 位 0.25M,即是用一个tail node,每次从head,tail中选取较近的那个进行遍历删除操作,所需均摊时间仍为线性。

考虑用resizing array,面对这样一个问题,假设已经有n个元素的array,随机删除一个元素后,我们要把那个空怎么补?依次将后面的元素放上来肯定不行,这样均摊时间肯定不是线性。想到一个好方法,用数组的最后一个元素替换(就像 BST 中删除操作一样),这样一来,删除操作只要O(1), 均摊时间肯定满足要求。

那这里的迭代器怎么实现呢?题设要求多个迭代器彼此独立(即每个迭代器都有自己的random order)。我们可以构造一个数组,数组大小为size,因为要求的迭代器不支持remove操作,所以数组中只要放置元素数组的索引就ok了(这里是1、2、3... n),然后只要将这个数组shuffle就ok了(或者也可以跟上面数组一样,与最后一个索引替换,然后删除最后一个索引)

 

posted @ 2015-09-22 18:18  whu.yt  阅读(183)  评论(0编辑  收藏  举报