Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 理解算法的时间复杂度_Algorithm_Complexity Theory_Big O - Fatal编程技术网

Algorithm 理解算法的时间复杂度

Algorithm 理解算法的时间复杂度,algorithm,complexity-theory,big-o,Algorithm,Complexity Theory,Big O,我刚刚开始学习大O的概念。我学到的是,如果一个函数f小于或等于另一个函数g的常数倍,那么f就是O(g) 现在我遇到了一个例子,其中一个大小为“n”的字符串采用“2n”(输入大小的两倍)的算法步骤。所以他们说所花费的时间是O(2n),但是他们接着说,作为O(2n)=O(n),时间复杂度是O(n) 我不明白。因为2n总是大于n,我们怎么能忽略2的倍数呢?任何小于或等于2n的值都不一定小于n 这不意味着我们在某种程度上等于n和2n吗?听起来很混乱。请以最简单的方式澄清,因为我只是这个概念的初学者。 致

我刚刚开始学习大O的概念。我学到的是,如果一个函数f小于或等于另一个函数g的常数倍,那么f就是O(g)

现在我遇到了一个例子,其中一个大小为“n”的字符串采用“2n”(输入大小的两倍)的算法步骤。所以他们说所花费的时间是O(2n),但是他们接着说,作为O(2n)=O(n),时间复杂度是O(n)

我不明白。因为2n总是大于n,我们怎么能忽略2的倍数呢?任何小于或等于2n的值都不一定小于n

这不意味着我们在某种程度上等于n和2n吗?听起来很混乱。请以最简单的方式澄清,因为我只是这个概念的初学者。 致以最诚挚的问候:)

。。。因为2n总是大于n,我们怎么能忽略2的倍数呢

简单地说,随着
n
的增长,乘数失去了它的重要性。函数的渐近行为描述了
n
变大时发生的情况

<>也许它不仅有助于考虑<代码> o(n)< /代码>和<代码> o(2n),因为它们在同一个类中,但与某些类进行了对比。示例:任何
O(n^2)
算法从长远来看都要比任何
O(n)
算法花费的时间更长(从短期来看,它们的运行时间甚至可能会颠倒)。假设您有两个算法,一个算法的线性时间复杂度为
100n
,另一个算法的线性时间复杂度为
8n^2
。对于所有
n=<12
,二次算法将更快,但对于所有
n>12
,二次算法将更慢


这个属性——对于任何固定非负
c
d
你会发现一个
n
,因此
cn
——构成了时间复杂性层次结构的一部分。

正如你在第一段中提到的,执行算法所需的时间与输入大小的常数倍数成正比。你可以把O(n)想象成O(C*n),其中C是任何常数乘数。

Big-O和相关符号旨在捕捉算法最固有的算法性能方面,与算法的运行和测量方式无关

常数乘数取决于测量单位,秒与微秒与指令与循环迭代。即使用相同的单位测量,如果在不同的系统上测量,它们也会有所不同。同一算法可能在一个指令集中包含20n条指令,在另一个指令集中包含30n条指令。一个可能需要0.5n微秒,另一个可能需要10n微秒

您将在文献中看到的许多基本算法复杂性是几十年前计算出来的,但在处理器体系结构的重大变化和性能的更重大变化中仍然有意义

类似的考虑也适用于启动和类似的管理费用


如果存在常数n和c,那么A
f(n)
就是
O(n)
,对于所有
n>=n,f(n)的渐近计算是通过计算极限来完成的。一个更接近于真实交易的估计,T(n),f(n)=2n,g(n)=n,f