Big O Notation Confusion(C ++)

时间:2017-06-09 03:01:21

标签: c++ loops big-o

int f(const std::vector<int>& v) {      
    int result = 0;
    for (int i = 0; i < v.size(); ++i) {                O(N)
        for (int j = v.size(); j >= 0; j -= 2) {        O(N/2)
            result += v.at(i) * j;
        }
    }
    return result;
}

内部for循环是O(N / 2),但是我想知道为什么这是因为

例如,如果v.size()为10,则

10&gt; =0✓

8&gt; =0✓

6&gt; =0✓

4&gt; =0✓

2&gt; =0✓

0&gt; =0✓

-2失败

内部for循环可以执行6次,输入大小为10

我错过了什么?

编辑*我理解只考虑最高等级。这个问题更多的是提出原始的O(N / 2 + 1)

2 个答案:

答案 0 :(得分:1)

复杂性为您提供了一种方法来评估完成特定大小的输入所需的时间大小,而不是它将执行的准确时间。

因此,在处理复杂性时,您应该只考虑最高幅度,而不考虑常数乘数:

O(N/2 + 1) = O(N/2) = O(N)

答案 1 :(得分:0)

在评论中,你说:

  

我理解这一点,但我很好奇O(N / 2)是如何获得的

看一下下表:

Size of vector     Number of time the inner loop is executed:
0                  1
1                  1
2                  2
3                  2
... 
100                51
101                51
...
2x                 x + 1
2x + 1             x + 1

如果从该等式中取常数1,则内循环为O(N/2)