std::list::p ush_back() 的运行时复杂性

run time complexity of std::list::push_back()

本文关键字:复杂性 运行时 list ush std back      更新时间:2023-10-16

以下代码的运行时复杂度是多少

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::p ush_back() 的时间复杂度应该是 O(n),这在我的情况下是不需要的。但是,如果不是,您能否解释运算符 * 和 ++ 继承的算法,以便可以确定它们的时间复杂度?是否建议为我的情况使用列表?(如果 'i' 不是数组,那么可以安全地假设 std::list::p ush_back() 的时间复杂度为 O(1) )

很抱歉我以前的问题版本不是那么可读

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

不,我不这么认为。标准中没有任何地方提到这样的数组,在列表容器中有这样的数组会很奇怪。

作为旁注:如果这样的数组存在,增长它将是 O(n),而不是 O(n^2)。如果插入的大小在填满时乘以,例如std::vector会怎么做,这可能会使插入摊销 O(1)。

std::list 通常是一个双向链表实现,而不是数组实现。换句话说,std::list 是双链表的更高层次的抽象。