我想知道,为什么Big O表示法是平均数组/堆栈/队列的O(1)。我们插入和删除元素的情况?
在我的理解中,它是O(1)因为交换和删除元素需要一定的时间,无论集合中的数据量如何,但我仍然有点困惑。任何帮助都将在消除我的困惑中受到高度赞赏。
答案 0 :(得分:1)
O(1) - 符号表示操作是在恒定时间内执行的。
O(n) - 符号表示操作是在线性时间内执行的,例如遍历一个清单。
我们从最明显的一个开始。数组 A 具有固定长度 n ,通过寻址内存中的适当位置,可以在恒定时间内访问其元素,即
A[i]=10;
Stack是一种后进先出数据结构。我们总是有一个指向top元素的指针/引用。因此,即使堆栈是作为列表实现的,我们也无法在常量时间内处理其中的特定元素(我们必须遍历 O(n)中的列表),我们正在访问最顶层pop / peak的元素,我们有一个指针/引用,因此可以在恒定时间 O(1)中访问。
Stack.pop(); //or peak() perhaps
队列是先进先出的数据结构。与堆栈一样,访问Queue的特定元素可以在线性时间 O(n)中完成,因为我们需要遍历它。但是我们通常有一个指向队列的第一个和最后一个元素的指针/引用。因此,入队和出队都可以在恒定的时间内执行 O(1)。
答案 1 :(得分:0)
对于基于数组的堆栈,所有操作均为O(1),因为您只能删除堆栈顶部的项目(不必循环或迭代或执行任何其他操作)。插入是相同的。 对于基于链接的堆栈,除析构函数外,它们也都是O(1),因为您必须遍历节点并删除每个节点。 对于基于数组的que,我只能确定双端队列为O(N),因为您返回第一个项目,然后您将向前移动。
我建议观看this guy's videos,他在其中详细介绍了所有这些内容。祝你好运!