【发布时间】:2015-01-03 12:08:21
【问题描述】:
以下代码的运行时间复杂度是多少
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) 是安全的)
对不起,我以前版本的问题不太可读
【问题讨论】:
-
我认为没有指针数组,列表中的元素指向下一个(和上一个)元素。
-
为什么你认为是O(N^2)???
-
*(++i) 怎么样?不像访问数组吗?
-
@chessHacker 这是一个迭代器,他们的
*和++运算符重载。它们的行为不像在数组中。 * 确实取消引用迭代器。但 it++ 会跳转到列表中的下一个元素,而不是数组中。根据定义,列表元素在内存中并不相邻。 -
@chessHacker 就像访问迭代器一样。在某些方面,迭代器的接口与指针非常相似。
标签: c++ arrays list c++11 time-complexity