了解方法的空间复杂性有一些问题。
在堆栈和搜索功能的情况下,我理解时间复杂度为O(n)
,因为它取决于堆栈中的元素数量。在这种情况下,空间复杂度会是多少?它是O(1)
,因为没有变量,或者搜索是否根据元素的数量消耗额外的内存并使其成为O(n)
?
防爆功能:
return stack.search(item) != -1
编辑:
以下是内置函数:
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
public synchronized int lastIndexOf(Object o, int index) {
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
if (o == null) {
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
有人可以逐步分析如何计算空间复杂度吗?
答案 0 :(得分:1)
Stack.search
的Javadoc中似乎没有记录时间和空间复杂性。
但是,简要介绍一下OpenJDK源代码会显示it's implemented in terms of Vector.lastIndexOf()
,而is a linear scan with just a couple of helper variables依次显示{{3}}。所以是的,O(1)空间在实践中。
答案 1 :(得分:0)
我没有明白你提到的O(n)。 Stack是O(1)时间用于存储(推送)和O(1)用于检索(pop)。
没有定义任何操作来搜索正确的堆栈数据结构。 Stack简单地以Last In First Out方式工作。当您添加新项目时,将其添加到顶部,当您检索项目时,您只有一个选项,即顶部。因此,推送和弹出操作都具有O(1)的时间复杂度。
谈到空间复杂性,我们需要知道问题所在。如果需要在堆栈中同时存储n个项目,则空间复杂度为O(n)。但是你也可以在O(1)空间中存储n个项目。您可以按下并弹出每个项目,因此您只使用1个空格。
那么这个Java实现中发生了什么?
似乎他们只是简单地实施了搜索方法,以防万一,也许有人会需要,我不知道。但它只是违反了堆栈合同。
如果你在堆栈上使用搜索,那么它的时间复杂度是O(n),它实际上不再是一个堆栈。空间复杂度是O(1),你猜对了。它只使用1个额外的变量,它不会随堆栈大小而扩展。
编辑:对不起,我没有意识到这是Java的堆栈实现特定问题。我正在编辑我的答案以涵盖Java实现。