假设我们有一个1.000.000元素的数组,我们通过所有这些元素检查一些简单的东西,例如,如果第一个字符是“A”。从我(很少)的理解来看,复杂性将是O(n)
,并且需要花费大约X个时间。如果我添加另一个IF(不是if)进行检查,让我们说,如果最后一个字符是“G”,它将如何改变复杂性?它会增加复杂性和时间吗?与O(2n)
和2X
一样?
我想避免考虑不同命令必须进行的计算次数。例如,我理解Len()需要更多的计算才能给出结果而不是简单的char比较,但是我们可以说IF中使用的命令(几乎)具有相同的复杂度。
答案 0 :(得分:12)
O(2n) = O(n)
。推广O(kn) = O(n)
,k
为常量。当然,有两个IF可能需要两倍的时间,但执行时间仍然是输入大小的线性函数。
编辑:Here是一个解释,并举例说明了不太过于数学的大O符号
答案 1 :(得分:4)
渐近复杂度(大O使用的)不依赖于常数因子,更具体地说,您可以向函数添加/删除任何常量因子,它将保持等效(即O(2n)= O(n))。
假设if语句需要一段时间,它只会为复杂性添加一个常数因子。
“恒定的时间”意味着:
因此,为每个元素调用的2个(常量时间)if语句将为O(2n),但这等于O(n)(嗯,它可能不是2n,更多的是在附加中注释)。
有关详细信息和更正式的定义,请参阅Wikipedia。
注意:除了不依赖于常数因子之外,它还不依赖于渐近较小的项(无论n多大都保持较小的项),例如O(n)= O(n + sqrt(n))。而且大O只是一个上限,所以说它是O(n 9999 )也是正确的(虽然说在测试/考试中可能会得到0分)。
附加说明 不忽略常数因素时的问题是 - 什么归类为工作单元?这里没有标准定义。一种方法是使用时间最长的操作,但确定这可能并不总是直截了当,也不总是特别准确,也不能一般地比较不同算法的复杂性。
答案 2 :(得分:0)
关于时间复杂度的一些要点:
注意:所有这些符号都不取决于输入是最好的/平均的/最差的,所有这些都可以应用于任何一段代码。
因此,如上所述,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)是较小的术语并不意味着我们可以忽略它。如果它是可变的,则不能忽略乘法因子。