什么是堆栈,队列,集合和双端队列的Big-O?

时间:2014-08-20 19:40:40

标签: stack set queue big-o deque

与插入,搜索,索引,空格和删除复杂性有关的堆栈,队列,集合和双端队列的Big-O效率是多少?

5 个答案:

答案 0 :(得分:7)

这实际上取决于每个数据结构的实现。我会讨论几个,这样你就可以了解如何确定这一点。

我们假设Stack类是使用Node实现的(它可以用LinkedListArrayListarrray等实现。

Node top, bottom;
public Stack(Node n){
    top = bottom = n;
}

Stack有3种主要方法:peekpushpop

public int peek(){
    return top.value; //only return value
}

涉及的处理不多。它只返回了一个原始值。时间和空间都是 O(1)

public void push(Node n){
    n.next = top;
    top = n;
}

仍然没有真正的处理。时间和空间都是 O(1)。让我们跳过pop()并尝试更有趣的事情。让我们尝试一种名为contains(int v)的方法。它将搜索堆栈以查看它是否包含Node,其中包含的值等于v

public bool contains(int v){
    Node current = top;
    while(current != null){
        if(current.value == v){
            return true;
        }
        current = current.next;
    }
    return false;
}

基本上,我们将遍历Node引用,直到找到值或结束。在某些情况下,您会及早发现价值,在某些情况下会在未来发现。但是,我们关心最坏的情况!最糟糕的情况是我们必须检查每一个Node。假设有 n 节点,那么我们有 O(n)

您可以将这些分析技能应用于其他数据结构,因此您可以自己解决其余问题。这不是太糟糕。祝好运。 :)

答案 1 :(得分:3)

我一直在使用它:http://bigocheatsheet.com/,但几乎没有关于为何使用这些大O值的信息。你必须自己深入研究它。

答案 2 :(得分:1)

我很惊讶你无法在网上找到这些信息。

您在问题中列出的数据结构之间存在区别。

我将从队列和堆栈数据结构开始。堆栈和队列都提供对数据的专门访问,因为没有随机访问,只有顺序访问。因此,您无法谈论随机访问性能。在这种情况下,堆栈或队列的任何体面实现都将为插入和删除操作提供O(1)访问(以各自的形式)。

集合是一种非常不同的结构,其性能将在很大程度上取决于底层实现。例如,您可以使用基础哈希表实现一个集合,用于接近恒定时间的插入,删除和查找操作,或者您可以使用O(log n)的平衡搜索树来实现它。

答案 3 :(得分:1)

这里的问题是这些数据结构通常是根据其他数据结构实现的。例如,set可以实现为哈希表或使用红黑树算法。

堆栈不提供随机访问,但通常实现为一个内存块(例如一个数组),其中一个元素指向堆栈顶部,更新为push和{{1操作。

pop可以实现为具有非常不同的插入,删除和索引特征的数组或链表。 queue更有可能被实现为链接列表,但C ++标准库中的Microsoft实现使用混合方法(请参阅What the heque is going on with the memory overhead of std::deque?)。

答案 4 :(得分:0)

Big-O表示法通常保留用于算法和函数,而不是数据类型 此外,时间复杂性在很大程度上取决于实施。要求“堆栈”数据类型的Big-O时间复杂度就像要求“排序”的Big-O时间复杂度。这一切都取决于实施。 (更具体地说,某些特定于案例的优化和要求可能会大大改变时间复杂度。)

如果您希望使用C ++ STL作为参考实现,您可以找到有关每种列出的数据类型from here的复杂性的详细信息。只需搜索数据类型和操作。