计算堆栈搜索的空间复杂度

时间:2015-12-27 11:25:08

标签: java algorithm data-structures stack big-o

了解方法的空间复杂性有一些问题。

在堆栈和搜索功能的情况下,我理解时间复杂度为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;
}

有人可以逐步分析如何计算空间复杂度吗?

2 个答案:

答案 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实现。