这个代码是O(N)还是O(1)

时间:2009-08-12 17:39:26

标签: c++ big-o

vector<int>::iterator it;
vector<int> p;
p.push_back(4);
p.push_back(5);
p.push_back(6);
p.push_back(7);
it = p.begin() + 2;
cout << it << endl;

这是O(N)还是O(1)?为什么?

14 个答案:

答案 0 :(得分:15)

它是O(1)因为它具有恒定的操作次数。

答案 1 :(得分:13)

正如其他人所说,这是O(1)。但是,如果你打算写这样的东西:

vector<int>::iterator it;
vector<int> p;
p.push_back(4);
p.push_back(5);
p.push_back(6);
p.push_back(7);
...
p.push_back(n);
it = p.begin() + 2;
cout << *it << endl;

即:

for (int i=4;i<=n;i++)
  p.push_back(i);

然后它将是O(n),因为vector :: push_back()和vector :: begin()是O(1),vector :: push_back()执行n-3次。

答案 2 :(得分:9)

因为操作次数是固定的所以是O(1)。对于某些事物是O(N),必须在执行的操作数量上存在线性变化。

答案 3 :(得分:7)

每个操作都是(摊销)恒定时间,所以整个事情都是恒定时间。

答案 4 :(得分:2)

取决于您正在查看的操作,但它应该是O(1)。

创建向量和迭代器是常量时间,因为它是内存分配。根据实现情况,推入向量是恒定时间,但我相信STL impl是恒定时间。恒定时间推动的四个操作是恒定的。设置迭代器是恒定时间,因为获取向量的开始是常量,并且加法是常量。

最后,打印是恒定时间,因此整个过程是O(1)。

答案 5 :(得分:1)

是O(1)。为了使O(n)或O(非1)甚至相关,您需要至少有一个变量(当更改时)将通过更改需要的迭代或工作总量来影响算法的性能完成。

答案 6 :(得分:0)

我的猜测是你在询问p.begin()+ 2; (大多数人关心的是搜索而不是插入)。

它是简单的指针算术,所以是的,它是常数时间O(1)。如果这是一个链表遍历,那么它将是O(n)。当然,这假设整数向量列表的实现类似于数组 - 即它们都在连续的内存块中。

请参阅:http://www.cprogramming.com/tutorial/stl/iterators.html

  

迭代器通常很方便   指定特定范围   要经营的事情。例如,   item.begin(),item.end()的范围是   整个容器,但更小   切片可以使用。这是   彼此特别容易,   非常一般的迭代器类,   随机访问迭代器,即   功能上等同于指针   在C或C ++中,你可以   不仅增加或减少,而且   也可以移动任意距离   恒定时间(例如,跳跃   向量中的多个元素)。

答案 7 :(得分:0)

我认为答案取决于'+'运算符的工作原理。如果它是简单的指针算术,则它是O(1)。

答案 8 :(得分:0)

它可以是从O(1)到指数的任何东西,实际上取决于push_back的实现。

答案 9 :(得分:0)

只要vector的函数以确定的方式实现(它们应该是或者某些东西是严重错误的),它就是O(1)。周期。

关于向量函数实现的整个讨论没有实际意义,因为n的值是已知的。此代码段将始终运行完全相同的代码,并在给定的机器上使用给定的向量实现获取完全相同的时钟周期数。交换机器或实施,它仍然是O(1);它只需要不同的恒定时间。

记住,伙计们,O(1)并不一定意味着“快”。这意味着“非常可扩展。”

答案 10 :(得分:0)

您是在询问it = p.begin() + 2;吗?

以这种方式访问​​向量的元素是分摊常量时间(来自Random Access Iterator上的保证),就像写p[2]一样。因此,像it = p.begin() + n;这样的陈述是O(1)。

在没有告诉我们N是什么的情况下谈论O(N)是不正确的,但我假设你在谈论数组查找,其中N是元素的数量。你也可能在最后一行表示cout << *it << endl;

答案 11 :(得分:-1)

真的,这取决于push_back和内部开始做什么。如果其中任何一个(或两个)都是O(n)那么整个事物就是O(n),因为O(N)支配O(1)并且它们的数量是恒定的。对于大于O(1)的任何东西也是如此,例如O(nlogn)。如果两者都是O(1)那么整个事物就是O(1),因为它们的数量是恒定的。很可能它是O(1),因为push_back和begin通常很简单,写成O(1)。

答案 12 :(得分:-1)

在最坏的情况下,推送到矢量不会在恒定时间内发生。如果矢量已满,它将在继续之前将内容复制到更大的矢量中。这是O(n)操作。

答案 13 :(得分:-3)

它是O(c),其中c是常数,因为没有一个非常数时间操作,但它是O(1)?我想假设所有这些操作的成本都是1。