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

use*_*586 0 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;
Run Code Online (Sandbox Code Playgroud)

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

Nav*_*een 15

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

  • 请记住,所有标准容器都有效率要求,因此如果您这样做,就不会有符合要求的实现. (10认同)
  • 我可以重新定义矢量类并使其不真实. (6认同)
  • @Sean,如果你这样做,它将不再是一个std :: vector,因为标准强制要求所有push_back操作分摊常量时间.所以不,每次调整存储大小都是不合理的. (6认同)
  • 你可以将矢量方法重新定义为非常低效但合理的东西.就像让push_back每次调整向量的存储大小或者迭代器每次都通过向量进行线性搜索一样; 使每个人都成为O(n).但push_back只被调用4次,而不是N次.其他方法每次只调用一次,使此代码剪切为O(1). (4认同)
  • @Sean符合标准的实现std :: vector :: push_back需要具有O(1)的摊销复杂度.每次推送调整矢量大小都不符合要求; 这就是埃文所说的. (2认同)
  • @Sean,David,......:我认为iftrue确实在考虑用恶意打算重新定义它.考虑到这一点:代码片段只使用了一个名为`vector`的类,不一定是`std :: vector`.那里没有效率要求. (2认同)

Oza*_*zan 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;
Run Code Online (Sandbox Code Playgroud)

即:

for (int i=4;i<=n;i++)
  p.push_back(i);
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*ela 9

它是O(1),因为它的操作数是固定的.对于O(N)来说,执行的操作数量必须存在线性变化.


Pla*_*ure 7

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