栈、队列、集合和双端队列在插入、搜索、索引、空间和删除复杂度方面的大O效率是什么?
我将为您解释一下它们各自的特点并简化了语言。栈、队列、集合和双端队列在插入、搜索、索引、空间和删除复杂度方面的大O效率是什么?
我将为您解释一下它们各自的特点并简化了语言。Node
实现(也可以使用LinkedList
、ArrayList
、array
等进行实现)。Node top, bottom;
public Stack(Node n){
top = bottom = n;
}
栈有三种主要方法:peek
,push
和pop
。
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)
的方法。它将搜索栈,以查看是否包含一个包含值等于v
的Node
。
public bool contains(int v){
Node current = top;
while(current != null){
if(current.value == v){
return true;
}
current = current.next;
}
return false;
}
基本上,我们会沿着节点引用移动,直到找到该值或到达末尾。在某些情况下,您可能会很早就发现该值,在某些情况下则更晚。然而,我们关心最坏情况!最坏的情况是我们必须检查每个单独的Node
。假设有n个节点,那么我们的时间复杂度为O(n)。
您可以将这些分析技巧应用于其他数据结构,因此您可以自己解决其余部分。这并不太难。祝你好运。 :)
我很惊讶你在网上找不到这些信息。
问题中列出的数据结构有所区别。我将从队列和栈数据结构开始。堆栈和队列都提供专门的数据访问方式,因为没有随机访问,只有顺序访问。因此,您不能谈论随机访问性能。在这种情况下,任何堆栈或队列的良好实现都将提供O(1)访问,无论是插入还是删除操作(以其各自的形式)。
集合是一种非常不同的结构,其性能将严重依赖于底层实现。例如,您可以使用底层哈希表实现集合,以获得接近恒定时间的插入、删除和查找操作,或者您可以使用平衡搜索树来实现它,以获得O(log n)的时间复杂度。
set
可以被实现为哈希表或使用红黑树算法。push
和pop
操作。
queue
可以被实现为具有非常不同插入、删除和索引特性的数组或链接列表。deque
更可能被实现为链接列表,但C ++标准库中的Microsoft实现使用了混合方法(请参见What the heque is going on with the memory overhead of std::deque?)。大O符号通常用于算法和函数,而不是数据类型。
此外,时间复杂度非常取决于实现方式。询问“堆栈”数据类型的大O时间复杂度就像询问“排序”的大O时间复杂度一样。这完全取决于实现方式。(更具体地说,某些特定情况下的优化和要求可能会显著修改时间复杂度。)
如果您想使用C++ STL作为参考实现,可以从这里找到每个列出的数据类型的复杂度详细信息。只需搜索数据类型和操作即可。