【问题标题】:Big O notation for Array/Stack/Queue数组/堆栈/队列的大 O 表示法
【发布时间】:2017-06-14 07:36:58
【问题描述】:

我想知道,为什么大 O 表示法是 avg 中的 Array/Stack/Queue 的 O(1)。我们插入和删除元素的情况?

在我的理解中,它是 O(1),因为无论集合中的数据量如何,插入和删除元素都会花费恒定的时间,但我仍然有点困惑。任何帮助将不胜感激,以消除我的困惑。

【问题讨论】:

  • 你对什么感到困惑?
  • @kennytm 当我们在平均情况下插入和删除数组/堆栈/队列中的元素时,为什么大 O 表示法是 O(1) 为什么不是 O(n)?
  • 这有帮助吗? *.com/questions/14307787/…
  • 至少不清楚这个问题的作者所说的“插入”是什么意思(特别是同时引用 3 个不同的数据结构),如果不是这也是多个其他问题的重复。不幸的是,他们似乎不再注册。由于所有这些原因,我认为应该关闭它。

标签: java arrays stack queue big-o


【解决方案1】:

O(1) - 符号表示操作是在恒定时间内执行的。

O(n) - 符号表示操作在线性时间内执行,例如遍历列表。

数组

我们从最明显的一个开始。数组A有一个固定长度n,它的元素可以在恒定时间内通过寻址内存中的适当位置来访问,即

A[i]=10;

堆栈

堆栈是一种后进先出的数据结构。我们总是有一个指向顶部元素的指针/引用。因此,即使堆栈实现为列表,我们无法在恒定时间内寻址其中的特定元素(我们必须在 O(n) 中遍历列表),我们正在访问最顶层带有 pop/peak 的元素,我们有一个指针/引用,因此可以在恒定时间内访问 O(1)

Stack.pop(); //or peak() perhaps

队列

队列是先进先出的数据结构。与堆栈一样,访问队列的特定元素可以在线性时间 O(n) 内完成,因为我们需要遍历它。但是我们通常有一个指向队列的第一个和最后一个元素的指针/引用。因此入队和出队都可以在恒定时间内执行O(1)

【讨论】:

  • 根据我的理解,Big-O 表示法是 avg 中的数组/堆栈/队列中的 O(1)。情况,因为无论数组的大小如何,插入和删除一个元素都需要 1 步。对于搜索元素,big-o 表示法是 O(n),因为有时我们要搜索的元素是数组的第一个元素或中间元素或最后一个元素。如果我的理解有误,请告诉我。
  • 我正在浏览这个 (packtpub.com/sites/default/files/downloads/…) 备忘单,我的问题是为什么这里没有数组/堆栈/队列、LinkedList、双链表、哈希表和二叉搜索树的最佳案例?
  • 为什么他们只指定了平均值。情况和最坏情况?为什么不是最好的情况?
【解决方案2】:

对于基于数组的堆栈,所有操作都是 O(1),因为您只能删除堆栈顶部的项目(您不必循环或迭代或执行任何其他操作)。插入是一样的。 对于基于链接的堆栈,除了析构函数之外,它们也是 O(1),因为您必须遍历节点并删除每个节点。 对于基于数组的查询,我只确定双端队列是 O(N),因为您返回第一项,然后您会移到前面。

我建议观看this guy's videos,他在那里深入解释了所有这些。祝你好运!

【讨论】: