大O符号混淆(C++)
内部for循环是ON/2,但是我想知道为什么这是因为 例如,如果v.size为10,则 10>=0✓ 8>=0✓ 6>=0✓ 4>=0✓ 2> =0✓ 0>=0✓ -2失败 内部for循环可以在输入大小为10的情况下执行6次 我错过了什么大O符号混淆(C++),c++,loops,big-o,C++,Loops,Big O,内部for循环是ON/2,但是我想知道为什么这是因为 例如,如果v.size为10,则 10>=0✓ 8>=0✓ 6>=0✓ 4>=0✓ 2> =0✓ 0>=0✓ -2失败 内部for循环可以在输入大小为10的情况下执行6次 我错过了什么 编辑*我知道只考虑最高震级。这个问题更多的是关于提出最初的ON/2+1的问题,复杂性为您提供了一种方法来评估完成某个大小的输入所需的时间,而不是它将执行的准确时间 P>因此,在处理复杂性时,你应该只考虑最高值,而不是常数乘积: int f(const std
编辑*我知道只考虑最高震级。这个问题更多的是关于提出最初的ON/2+1的问题,复杂性为您提供了一种方法来评估完成某个大小的输入所需的时间,而不是它将执行的准确时间 <> P>因此,在处理复杂性时,你应该只考虑最高值,而不是常数乘积:
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;
}
你在评论中说:
我理解这一点,但我只是好奇ON/2是如何获得的 请看下表:
O(N/2 + 1) = O(N/2) = O(N)
如果从方程中取常数1,则内循环为开/2。内循环为开。开/2=开。常数不是渐近增长符号的一个促成因素。我理解这一点,但我只是好奇ON/2是如何获得的,因为它足够接近摇滚乐。这也无关紧要。重要的是,如果你把N加倍,你的功就差不多加倍了。我忍不住要指出,作为旁白,整个计算可以重写为ON而不是ON^2.result+=N*v[I]+N-2*v[I]+N-4*v[I]+。。。与使用基本数学计算总标量N+N-2+N-4+相同。。。乘以v[i]一次。但这不是你的问题,所以我想我只是顺便提一下。啊,答案键是On/2,它把我甩了。我知道考虑的是最高震级,如果它在/2+1上是有意义的。顺便说一下,在j==0的情况下循环是没有意义的,因为它不会影响最终结果。@Uriel我想它仍然会运行2次?3>=0 , 1>=0, -1 fails@csguy我的错。我多次误解了你考虑问题的方式。开/2+1就可以了。
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