【问题标题】:Time complexity/performance of insertion operation for a Queue implementation (In java)队列实现的插入操作的时间复杂度/性能(在 java 中)
【发布时间】:2014-08-22 17:25:32
【问题描述】:

对于实现为 Queue 的插入操作的性能如何:

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

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

(c) 一个链表,其中的项目未排序。

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

请详细说明,对我有很大帮助!

【问题讨论】:

  • 嗯?不明白,unsorted 和 sorted order 怎么办?
  • 我说 ArrayQueue 通常是给类的名称,用于数组的队列实现,类似地,linkedQueue 用于链表。
  • cs.colorado.edu/~main/docs/edu/colorado/collections/… 对于 ArrayQueue "add(E item)" 是插入操作。是的,我也很困惑,为什么 unsorted 和 sorted 在这里很重要。这个问题对我来说似乎很困惑。也许这与priorityQueue有关?我应该阅读更多关于这些的信息吗?
  • w3professors.com/Data/Courses/Data-Structure/Algorithms/Queue/…这是网上找的,不知道有没有什么意思。

标签: algorithm sorting queue time-complexity implementation


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • O(k+1) 与 O(k) 有什么不同吗?对于链表,我相信我听说元素是从行首插入并从行尾删除的。至少在这门课上。这将使链表删除 O(n) 并添加 O(1)。
  • O(k) 和 O(k+1) 是等价的,但您通常会写成 O(k)。我选择更精确,因为我想准确地强调引擎盖下发生的事情。至于您的链接列表,如果我理解正确,那么您所说的“前”我称为“头”,而您所说的“后”我称为“尾”。不过,正如我所说,有一种方法可以插入到 O(1),而不管实现细节如何
  • 我猜想绕过使用双链表?
  • 你在正确的轨道上,但双向链表不会给你优化。回想一下,双向链表中的节点既引用了它们的父节点,也引用了它们的子节点;虽然这在某些情况下很有用,但它并没有解决我的算法教授过去所说的插入算法的“基本事实”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2012-11-27
  • 2012-03-17
相关资源
最近更新 更多