c ++代码时间复杂度&&操作者

时间:2015-04-25 08:18:10

标签: c++ time-complexity

我有以下两个代码:

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。

1 个答案:

答案 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

这正是你在第二个例子中用手做的。 但是,这些东西对特定的编译器和优化设置有意义(在发布版本中,你的循环将完全由任何下降编译器消除)。