比较时间复杂性

时间:2013-12-07 15:58:20

标签: time-complexity notation

假设我们有一个算法,该算法遍历n个数字列表两次,并计算一次运行中50以上的数字和另一次运行中50以下的数字,并将这些数据存储在两个变量中。 如果我们通过在每个步骤中增加一个变量而不是一个变量来改变它在一次运行中做同样的事情,那么我们是否会改变算法的时间复杂度?我们是否更快地考虑新的?

我知道这需要更少的步骤,但不完全确定时间复杂度表示法。

编辑:

伪代码1:

for (i = 0; i < TOTAL_NUMBERS; i++) {
    if (numbers[i] >= 50) {
        greaterThan50++;
    }
}

for (i = 0; i < TOTAL_NUMBERS; i++) {
     if (numbers[i] < 50) {
        lessThan50++;
    }
}

伪代码2:

for (i = 0; i < TOTAL_NUMBERS; i++) {
    if (numbers[i] >= 50) {
        greaterThan50++;
    }
    else {
        lessThan50++;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您可以获得相同的结果,但具有最小的表达式,那么事情很简单。因此,在这种情况下,如果在同一循环中组合两个计数器的更新,则算法将需要较少的CPU周期来执行。您还可以节省数字验证的时间,因为您可以只使用一个if / else语句来执行您需要的操作。

伪代码可能如下所示:

for (i = 0; i < TOTAL_NUMBERS; i++) {
    if (numbers[i] >= 50) {
        greaterThan50 ++;
    }
    else {
        lessThan50 ++;
    }
}

如果要排除等于50的数字,可以执行以下操作:

for (int i = 0; i < TOTAL_NUMBERS; i++) {
    if (numbers[i] > 50) {
        greaterThan50 ++;
    }
    else if (numbers[i] < 50) {
        lessThan50 ++;
    }
}

正如您在最后一个示例中所注意到的那样,您正在进行额外的验证,因此需要额外的步骤,但是这个算法仍然比循环遍历列表快两倍(并且更简单,因为它需要更少的代码行并使代码更易读和易懂。

我希望这对您的问题有所帮助:)

答案 1 :(得分:0)

Big O表示法是关于测量(在您的情况下执行时间)如何随着输入增长而变化的一般声明。第一个执行时间要长两倍,但两个版本的执行时间在输入大小方面呈线性增长,因此它们都是O(n)算法。

更多阅读:http://en.wikipedia.org/wiki/Big_O_notation