具有多个条件的for循环的大O.

Osk*_*ito 3 java big-o

我不知道之前是否有人问我,因为我不确定如何制定我的搜索,但我会尝试.下面这段代码的大O是什么?

List<SomeObject> list = //... List is created here    .1

int sum = 0;                                          .2

for(int i = 0; i < list.size() && i < 75000; i++){    .3
    sum++;                                            .4
}
Run Code Online (Sandbox Code Playgroud)

我看到它的方式是第1,2和4行是O(1).然后第3行是O(N),因为它每次调用时都不会花费相同的时间.列表的大小将影响迭代量.这意味着整个代码块最终为O(N).或者这完全是胡说八道?

Dem*_*nes 5

列表创建不一定是O(1),可以是O(N).

第2行显然是O(1).

我认为循环也是O(1),因为它限制为75000个条目,所以有一个上限.没有i <75000限制,它将是O(N),正如你所说的那样.

所以第2-4行我会说是O(1),第1行真的取决于你省略的列表创建过程.

  • 所以你会说,如果我在第二个条件下<Integer.MAX_VALUE仍然是O(1)? (2认同)
  • 这变得有点哲学,但从数学上说,我会说是的,它是O(1).出于任何实际目的,我认为它是O(N),因为这基本上就是影响. (2认同)
  • 添加到我之前的评论:如果你把它限制在10而不是75000,几乎任何人都会说O(1),所以如果考虑说20亿O(N)的限制,它变成O(N)的极限是什么?这就是我的意思,它正在成为哲学.更严重的是:O(1)算法实际上可能比O(N)算法慢,它取决于常数...... (2认同)
  • 我们在这里讨论运行时间,而不是内存复杂性.不,O(1)并不意味着无论输入如何,运行时间都是相同的.O(1)意味着渐近,它是常数,即N朝向无穷大,它接近常数,在这种情况下它显然是这样(N = 75000的运行时间是上限). (2认同)