std :: list :: push_back()的运行时复杂度

时间:2015-01-03 12:08:22

标签: c++ arrays list c++11 time-complexity

以下代码的运行时复杂性

std::list<int> a;
a.push_back(1); //initialize
a.push_back(2);
a.push_back(3);
std::list<int>::iterator i = a.begin();
std::cout<<*(++i); // displays 2
std::cout<<*(++i); // displays 3

我正在编写一个目前正在进行数据挖掘的程序,我需要注意它的时间性能。我只是怀疑(我之前没有,因为我不关心我早期计划中的时间复杂性,因为它们是直接的)。因此,在更安全的一面,我想询问将一个元素添加到列表中的实际时间复杂度a。指针'i'在上面的行为就像一个数组,诱使我怀疑它是真的是一个数组还是一个重载了++和*运算符的对象。

如果'i'是一个数组,那么std :: list :: push_back()的时间复杂度应该是O(n),这对我的情况来说是不可取的。但是如果不是,你能解释运算符*和++所带来的算法,以便确定它们的时间复杂度吗?我建议使用列表吗? (如果'i'不是数组,则可以安全地假设std :: list :: push_back()具有时间复杂度O(1))

抱歉我之前的问题版本不太可读

2 个答案:

答案 0 :(得分:4)

  

因此应该有一个指针数组,每个指针指向链表中的每个节点。每次调用push_back()成员函数时,都应该清除并重新分配指针数组;你不这么认为吗?

不,我不这么认为。标准中没有提到这样的数组,在 list 容器中有这样的数据会非常奇怪。

作为旁注: 如果存在这样的阵列,那么它的增长将是O(n),而不是O(n ^ 2)。这可以使插入摊销O(1)如果它的大小在它充满时会成倍增加,例如std::vector将会如何。

答案 1 :(得分:0)

std :: list通常是双向链表实现,而不是数组实现。另外,std :: list是双向链表的更高级抽象。

相关问题