If statement IF如何影响复杂性?

If statement IF如何影响复杂性?,if-statement,complexity-theory,big-o,If Statement,Complexity Theory,Big O,假设我们有一个由1.000.000个元素组成的数组,我们通过检查所有元素来检查一些简单的东西,例如第一个字符是否是“A”。从我(很少)的理解来看,复杂度将是O(n),并且它将花费一些X的时间。如果我添加另一个If(而不是elseif)来检查,比如说,如果最后一个字符是“G”,它将如何改变复杂性?它的复杂性和时间会加倍吗?像O(2n)和2X 我希望避免考虑不同命令必须进行的计算数量。例如,我知道Len()比简单的字符比较需要更多的计算才能得出结果,但假设IFs中使用的命令(几乎)具有相同的复杂性。

假设我们有一个由1.000.000个元素组成的数组,我们通过检查所有元素来检查一些简单的东西,例如第一个字符是否是“A”。从我(很少)的理解来看,复杂度将是
O(n)
,并且它将花费一些X的时间。如果我添加另一个If(而不是elseif)来检查,比如说,如果最后一个字符是“G”,它将如何改变复杂性?它的复杂性和时间会加倍吗?像
O(2n)
2X

我希望避免考虑不同命令必须进行的计算数量。例如,我知道Len()比简单的字符比较需要更多的计算才能得出结果,但假设IFs中使用的命令(几乎)具有相同的复杂性。

O(2n)=O(n)
。广义化,
O(kn)=O(n)
,其中
k
为常数。当然,使用两个IFs可能需要两倍的时间,但执行时间仍然是输入大小的线性函数

编辑:通过示例说明了不太数学化的big-O表示法

渐近复杂性(这是big-O使用的)不依赖于常数因子,更具体地说,您可以在函数中添加/删除任何常数因子,它将保持相等(即O(2n)=O(n))

假设if语句需要固定的时间,它只会给复杂性增加一个固定的因素

“恒定时间”是指:

  • 给定元素的if语句所用的时间不取决于数组中有多少其他元素
  • 基本上,如果它不调用一个函数,该函数以某种方式或类似的方式查看数组中的其他元素
  • 任何调用if语句的非函数都可以(除非它包含通过数组的语句,这是某些语言允许的)
因此,为每个元素调用的2(恒定时间)if语句将是O(2n),但这等于O(n)(好的,它可能不是2n,更多的是在附加注释中)

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

注意:除了不依赖于常数因子外,它也不依赖于渐近较小的项(无论n变得多大,这些项都会保持较小),例如O(n)=O(n+sqrt(n))。而big-O只是一个上限,所以说它是O(n9999)也是正确的(尽管在测试/考试中这样说可能会让你得0分)


补充说明:不忽略常量因子时,问题是-什么被归类为工作单元?这里没有标准的定义。一种方法是使用耗时最长的运算,但确定这一点可能并不总是直截了当的,也不总是特别准确,也无法对不同算法的复杂性进行一般性比较。

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

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

如果在遍历数组时,为了计算两条If语句,您必须读取每个完整条目,那么您的顺序将是O(1000000xn),其中N是每个条目的平均长度。如果N是可变的,那么它将影响顺序。例如标准乘法,我们对长度为Log(N)的条目执行Log(N)加法,因此顺序为O(Log^2(N)),或者如果您更喜欢O((Log(N))^2)

另一方面,如果您只需检查第一个和最后一个字符,则N=2且为常数,因此可以忽略


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

关于时间复杂性的一些关键点:

  • θ表示法-精确界,因此,如果我们正在分析的代码段包含条件if/else,并且其中任何一部分有更多的代码根据输入大小增长,则无法获得精确界,因为可能会采用任何一个分支,并且对于此类情况,不建议使用θ表示法。另一方面,如果两个分支都解析为常数时间代码,那么θ表示法可以应用于这种情况
  • Big O notation-上限,因此,如果代码有条件分支中的任何一个可能随输入大小n增长,那么我们假设max或上限来计算代码的时间消耗,因此我们使用Big O作为此类条件,假设我们采用的路径具有最大时间消耗。因此,在摊销分析中,时间较短的路径可以假设为O(1)(包括我们假设该路径没有可能随输入大小增长的递归)并计算最长路径的时间复杂度大O
  • 大欧米茄表示法-下限,这是一段代码在不考虑输入的情况下可以使用的最小保证时间。对于代码所花费的时间不会根据输入大小n增长,但会消耗大量时间k的情况,此功能非常有用。在这些情况下,我们可以使用下限分析
  • 注意:所有这些符号都不依赖于最佳/平均/最差的输入,所有这些都可以应用于任何代码段

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

    附:这篇文章是