int main()
{
for(long long i=0;i<10000000;i++)
{
}
return 0;
}
我之所以这样问是因为我想知道,是否空循环会增加程序的运行时间。例如,假设我们在循环中确实有一个函数,但是由于某些条件,它不会在每个循环中运行:
int main()
{
for(long long i=0;i<10000;i++)
{
for(long long i=1;i<10000;i++)
{
if(//"some condition")
{
func(); // some function which we know is going to run only one-hundredth of the time due to the condition. time complexity of func() is O(1).
}
}
}
return 0;
}
时间复杂度是否为O(N*N)
?
答案 0 :(得分:1)
时间复杂度仅在可变大小的数据集的上下文中才有意义;它描述了程序的总执行时间随着数据集大小的增加而增加的速度。。例如,如果您有N个项目要处理,并且您的算法需要读取每个项目固定次数,那么您的算法将被视为O(N)。
在第一种情况下,如果我们假设您有一个“数据集”,其当前大小为10000000,则您的单个for循环将为O(N),但是请注意,由于您的for循环没有任何可见的效果,优化的编译器都可能会完全忽略该循环,从而将其有效地减小为O(1)。
在您的第二个(嵌套循环)示例中(假设变量集大小为10000),算法为O(N ^ 2),因为程序必须执行的步数随平方的平方而增加。设置大小。不管内部if
测试多久一次为真,这都是事实,因为程序将不得不执行某些步骤(例如,评估if
条件),而不需要N * N次(或者很少) )if-test评估为true。 (同样,例外情况是,编译器可以某种方式证明if
语句从不评估为true,或者func()
函数没有可观察到的副作用,在这种情况下,它可以合法地省略整个过程,然后立即return 0
}
答案 1 :(得分:0)
您的第一个代码的最坏情况复杂度为O(n)
,因为它会重复n
次。不管它在每次迭代中什么都不做或无所事事,它总是具有O(n)
的复杂性。可能无法对其进行优化,并且优化程序可能不会跳过空循环。
类似地,您的第二个程序的复杂度为O(n^2)
,因为它多次迭代n^2
。内部的if
条件在某些情况下可能会满足,也可能不会满足,并且在if
不满足但访问了n^2
情况下,程序可能不会执行。足以建立O(n^2)
复杂度。