队列实现的插入操作的时间复杂性/性能(在java中)

时间:2014-07-02 03:18:33

标签: algorithm sorting queue time-complexity implementation

实施的队列的插入操作的性能如下:

(a)一个数组,其中的项目未按顺序排列

(b)一个数组,其中的项目按排序顺序

(c)链接列表,其中的项目未按顺序排列。

对于每个操作和每个实现,以Big Oh表示法给出性能并解释足够的算法来证明您的答案。 (例如,它需要O(n)次,因为在更糟糕的情况下......算法会这样做......)。

请详细解释,它会帮助我很多!

1 个答案:

答案 0 :(得分:2)

简短回答:这取决于您的数据结构。

在一个简单的基于数组的实现中(假设固定大小),我认为很明显插入是一个常量操作(即O(1)),假设你没有运行在阵列的末尾。这在循环数组中类似,具有类似的假设。

动态数组有点复杂。动态数组是一个固定大小的数组,一旦填充到某个点就可以放大。因此,对于在达到 k 长度时调整大小的动态数组,第一个 k-1 插入是常量(就像插入普通数组一样)和 k - 插入需要O( k +1) - 将数组内容复制到更大的容器中,然后插入元素的成本。您可以证明这适用于O(1)插入时间,但这可能超出了您的课程范围。

正如其他人所说,排序顺序不会影响标准队列。如果您实际上正在处理优先级队列,那么有很多可能的实现,我将让您自己研究。最佳插入时间是O(1),但该实现具有一些缺点。标准实现是O(log n )插入。

对于链接列表,插入时间取决于列表的头部是否是队列的头部(即,是否添加到头部或尾部)。

如果您要添加到头部,那么很容易看到插入是O(1)。如果您要添加到尾部,那么对于长度为 n 的列表,也很容易看到插入是O( n )。重点是,无论您选择哪种实现,insert都将是O(1)或O( n )中的一个,并且删除将始终是另一个。

但是,有一个简单的技巧可以让你在任何一种情况下都插入和删除O(1)。我会留给你考虑如何做到这一点。