C++ 计算嵌套循环的大O
我在为下面的代码计算大O时遇到问题。我从来都不是最聪明的人。 有人能解释一下吗。由于嵌套循环,我猜这里是O(N^2),但我知道还有更多C++ 计算嵌套循环的大O,c++,algorithm,big-o,time-complexity,C++,Algorithm,Big O,Time Complexity,我在为下面的代码计算大O时遇到问题。我从来都不是最聪明的人。 有人能解释一下吗。由于嵌套循环,我猜这里是O(N^2),但我知道还有更多 static inline int f1 (int a, int b) { for (int c = 0; c < b; c++) { a -= n; } return a; } int f2 (int n) { int r = n * n * n; for (double i = n; i >= 0; i -= 2)
static inline int f1 (int a, int b)
{
for (int c = 0; c < b; c++)
{
a -= n;
}
return a;
}
int f2 (int n)
{
int r = n * n * n;
for (double i = n; i >= 0; i -= 2)
{
r = f1(r, i);
}
return r;
}
静态内联int f1(int a,int b)
{
for(int c=0;c=0;i-=2)
{
r=f1(r,i);
}
返回r;
}
首先,请注意f1的运行时完全取决于第二个参数,该参数控制循环迭代次数。因此,它的运行时间在第二个参数中是线性的
接下来,请注意f2中的循环运行n/2次,i的值为0、2、4、6、…、n。由于i是f1的第二个参数,因此运行时由
0+2+4+…+n
=2(0+1+2+n)
=2Θ(n^2)
=Θ(n^2)
所以运行时是Θ(n^2)。请注意,几乎所有其他事情都是为了误导你而分心。只关注控制迭代和循环的变量会揭示出您需要关注的实际逻辑
希望这有帮助
int r = n * n * n;
for (double i = n; i >= 0; i -= 2)
{
for (int c = 0; c < i; c++)
{
r -= n;
}
}
intr=n*n*n;
对于(双i=n;i>=0;i-=2)
{
对于(int c=0;c
正如其他人所建议的,是的,您可以折叠常量部分(在本例中为“/2”),但在我看来,这与我最初发布的内容更为清晰。希望这也能有所帮助。从数学上讲,你可以像下面这样正式地进行: 其中op是在
f1()
中执行的恒定时间op操作数。
我本可以为f2()
添加op'
或类似的内容,但这似乎没有必要
要计算运算的次数,比如T(10),只需让O((N/2)^2)不是一件事。在计算O时,你可以去掉/折叠常数。我认为没有比这更重要的了。我认为,计算大O符号是非常直观的。+1和第二到第三行是通过认识到1+2+3+…+n是(你在英语中称之为?)来完成的。它归结为1+2+3+…+n与
n*(n+1)/2相同,它与n^2
成比例缩放。