【问题标题】:Comparing time complexities比较时间复杂度
【发布时间】:2013-12-07 15:58:19
【问题描述】:

假设我们有一个算法,它遍历 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++;
    }
}

【问题讨论】:

  • 当您说“时间复杂度”时,您指的是大 O 符号吗?还是实际运行时间?

标签: time-complexity notation


【解决方案1】:

如果你能得到相同的结果但用最小的表达式,事情就很简单了。因此,在这种情况下,如果您将两个计数器的更新组合在同一个循环中,则该算法将需要更少的 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 ++;
    }
}

您可能会注意到,在最后一个示例中,您正在进行额外的验证,因此需要额外的步骤,但该算法仍然比循环遍历列表两次要快得多(而且更简单,因为它需要更少的代码行并使代码更具可读性和易于理解)。

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

【讨论】:

    【解决方案2】:

    Big O 表示法是关于测量(在您的情况下为执行时间)如何随着输入的增长而变化的一般性陈述。第一个需要两倍的时间来执行,但是两个版本的执行时间都随着输入大小线性增长,所以它们都是 O(n) 算法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多