我有以下两个代码:
int i=0;
while(i<=1000000000 && i!=-1) {
i++;
}
我认为运行时复杂度为40亿次
在while条件下是3个操作(i<=1000000000),(i!=-1) and &&
,
和
int i=0;
while(i!=-1) {
if(i>=1000000000) break;
i++;
}
我认为运行时复杂度为30亿,
在while条件中,if是1个操作(i<=1000000000)
中的1个操作(i!=-1)
,
但是当我运行它时,两个代码的运行时间相同,为什么会这样?
我已将这两个代码更改为如下:
int n = 1000000000;
int i=0;
while(i<=n && i!=-1) {
i++;
}
int n = 1000000000;
int i=0;
while(i!=-1) {
if(i>=n) break;
i++;
}
这次第三个代码块在2.6s
中运行,第四个代码块在3.1s
中运行,
为什么会这样?
这四个代码的时间复杂度是多少?
我使用dev-c ++ IDE。
答案 0 :(得分:1)
时间复杂度和实际运行时间是两个非常不同的东西。
当我们讨论变量输入大小时,时间复杂性才有意义。它告诉我们算法如何更好地扩展输入。如果我们假设您的输入为n
(或前两种情况下为1000000000
),那么您的所有示例都具有线性时间复杂度。粗略地说,如果你把n
大两倍,那么运行时间也会增加一倍。
实际运行时间在某种程度上取决于复杂性,但您无法可靠地计算它。原因是:编译器优化,CPU优化,OS线程管理等等。
我认为时间复杂度&#39;你的意思是计算机执行的基本操作数。然后
之间没有区别while(i<=1000000000 && i!=-1)
和
while(i!=-1) {
if(i>=1000000000) break;
因为很可能运算符&&
实现的不是&#39;取第一个操作数,取第二个操作数,然后对它们执行某些操作,但作为条件序列跳转:
if not FirstCondition then goto FalseBranch
if not SecondCondition then goto FalseBranch
TrueBranch:
... here is your loop body
FalseBranch:
... here is the code after loop
这正是你在第二个例子中用手做的。 但是,这些东西只对特定的编译器和优化设置有意义(在发布版本中,你的循环将完全由任何下降编译器消除)。