IF如何影响复杂性?

时间:2013-06-04 12:32:17

标签: if-statement complexity-theory big-o

假设我们有一个1.000.000元素的数组,我们通过所有这些元素检查一些简单的东西,例如,如果第一个字符是“A”。从我(很少)的理解来看,复杂性将是O(n),并且需要花费大约X个时间。如果我添加另一个IF(不是if)进行检查,让我们说,如果最后一个字符是“G”,它将如何改变复杂性?它会增加复杂性和时间吗?与O(2n)2X一样?

我想避免考虑不同命令必须进行的计算次数。例如,我理解Len()需要更多的计算才能给出结果而不是简单的char比较,但是我们可以说IF中使用的命令(几乎)具有相同的复杂度。

4 个答案:

答案 0 :(得分:12)

O(2n) = O(n)。推广O(kn) = O(n)k为常量。当然,有两个IF可能需要两倍的时间,但执行时间仍然是输入大小的线性函数。

编辑Here是一个解释,并举例说明了不太过于数学的大O符号

答案 1 :(得分:4)

渐近复杂度(大O使用的)不依赖于常数因子,更具体地说,您可以向函数添加/删除任何常量因子,它将保持等效(即O(2n)= O(n))。

假设if语句需要一段时间,它只会为复杂性添加一个常数因子。

“恒定的时间”意味着:

  • 给定元素的if语句所花费的时间不依赖于数组中有多少其他元素
  • 所以基本上如果它没有调用一个以某种方式查看数组中其他元素的函数或类似的东西
  • 任何非函数调用if语句都可能正常(除非它包含一个通过数组的语句,某些语言允许)

因此,为每个元素调用的2个(常量时间)if语句将为O(2n),但这等于O(n)(嗯,它可能不是2n,更多的是在附加中注释)。

有关详细信息和更正式的定义,请参阅Wikipedia

注意:除了不依赖于常数因子之外,它还不依赖于渐近较小的项(无论n多大都保持较小的项),例如O(n)= O(n + sqrt(n))。而且大O只是一个上限,所以说它是O(n 9999 )也是正确的(虽然说在测试/考试中可能会得到0分)。

附加说明 忽略常数因素时的问题是 - 什么归类为工作单元?这里没有标准定义。一种方法是使用时间最长的操作,但确定这可能并不总是直截了当,也不总是特别准确,也不能一般地比较不同算法的复杂性。

答案 2 :(得分:0)

关于时间复杂度的一些要点

  1. Theta 符号 - 精确绑定,因此如果我们正在分析的一段代码包含条件 if/else 并且任一部分都有更多的代码根据输入大小增长,那么精确绑定就不能获得,因为可能采用任何一个分支,并且在这种情况下不建议使用 Theta 表示法。另一方面,如果两个分支都解析为常量时间码,则 Theta 表示法可以适用于这种情况。
  2. Big O 符号 - 上限,因此如果代码具有条件分支,其中任一条件分支可能随着输入大小 n 增长,那么我们假设最大或上限来计算时间消耗代码,因此我们将 Big O 用于此类条件,假设我们采用具有最大时间消耗的路径。因此,在摊销分析中,时间较短的路径可以假设为 O(1)(包括我们假设这条路径没有可能随输入大小增长的递归这一事实)并计算最长路径的时间复杂度 Big O .
  3. Big Omega 符号 - 下限,这是一段代码无论输入如何都可以占用的最短保证时间。对于代码所花费的时间不会根据输入大小 n 增长但会消耗大量时间 k 的情况很有用。在这些情况下,我们可以使用下限分析。

注意:所有这些符号都不取决于输入是最好的/平均的/最差的,所有这些都可以应用于任何一段代码。

因此,如上所述,Big O 不关心 k 等常数因子,只看到时间随 n 的增长而增加,在这种情况下,它是 O(kn) = O(n) 线性。

PS:这篇文章是关于摊销分析的大O和条件评估标准的关系。

答案 3 :(得分:-2)

这与我今天发布的一个问题有关。

在您的示例中,它取决于您是否可以从第一个元素跳到最后一个元素,如果不能,那么它还取决于每个条目的平均长度。

如果你在数组中走下去,你必须阅读每个完整的条目,以便评估你的两个if语句,那么你的订单将是O(1,000,000xN),其中N是每个条目的平均长度。如果N是可变的,那么它将影响订单。一个例子是标准乘法,其中我们执行一个条目的Log(N)加法,该条目是长度为Log(N),因此顺序为O(Log ^ 2(N))或者如果您更喜欢O((Log(N)) )^ 2)。

另一方面,如果您可以检查第一个和最后一个字符,那么N = 2并且是常数,因此可以忽略。

这是一个重要的一点,你必须要小心,因为你如何决定你的乘数是否可以被忽略。例如,假设我们正在添加Log(N / 100)数字的Log(N)。现在只是因为Log(N / 100)是较小的术语并不意味着我们可以忽略它。如果它是可变的,则不能忽略乘法因子。