当我们从时间和空间方面分析任何算法的复杂性时,我们永远不能以确切的数字去定义运行算法所需的时间和空间,因此我们需要用一些标准符号来表达,也被称为渐近符号。
当我们在分析任何一个算法时,我们通常会用一个公式来表示执行该算法所需的时间或者计算机编译运行所需的时间,内存访问次数,比较次数,占用内存的临时变量等,该公式通常包含一些不重要的细节来告诉我们算法运行的时间。
我们来举一个例子,如果某些算法的时间复杂度为T(n)=(n ^2 + 3n + 4),这是一个二次方程。对于较^大的值n,对于n^2来说,3n+4这部分变得无关紧要。
对于n=1000,n^2=1000000,3n+4=3004,可见3n+4是可忽略不计的。
对外,当我们对比俩算法的时间复杂度时,高阶项的常数系数也被忽略。
对于任何大于200的n值,一个需要200n^2的算法将比其他需要n^3时间的算法更快。由于我们只关心函数增长的渐近行为,常数因子也可以忽略。
什么是渐近行为
‘渐近’一词意味着无限接近一个曲线或者一个值(在某种限制下)
我们来举一个例子
如果我们有两个算法,下面的表达式表示他们执行所需要的时间,那么:
表达式1:(20n^ 2 + 3n – 4)
表达式2:(n ^3 + 100n – 2)
现在,根据渐近符号,我们应该观察函数如何随着n(输入)的值的增长而增长,这完全取决于表达式1的n^2和表达式2的n^3。因此,我们可以说,运行时间由表达式2表示的算法将比另一个算法增长更快,只需要分析最高项即可,类似于3n-4或者100n-2这种项可以直接忽略。
这里面的核心思想是抛弃不太重要的部分,使其更易于管理。
我们要做的是,第一部,分析算法找到表达其时间的公式。。然后分析该公式怎么随着n的增长而增长。
渐近符号的类型
我们通常使用三种类型的渐近符号来表示任意算法的增长。
- Big Theta (Θ)
- Big Oh(O)
- Big Omega (Ω)
渐近紧确界 :Big Theta (Θ)
Big Theta 通常表示算法的实际执行时间所在的平均值的或者范围的时间复杂度。
例如,如果对于某些算法,时间复杂度由表达式3n^2+5n表示,并且我们使用Big Theta表示法来表示此。则时间复杂度将为Θ(n ^2)(忽略常数系数并移除不重要的部门即5n.这里
这里,在上面的例子中Θ(n ^2)的复杂性意味着任何输入的平均时间都将保持在其间,并且在k1,k2是两个常数的情况下,通过紧密的结合表达式来表示算法的增长k1n^2 ,k2n^2
渐近上限: Big Oh(O)
这种表示法被称为算法的上界,或者算法的最坏情况,
它通常告诉我们某个函数永远不会超过输入值的指定时间n
那么问题来了,当我们有Θ这种表达方式的时候,为什么还需要O来表示,下面我们将以一个小例子来介绍一下
在线性搜索算法,我们需要遍历每一个元素,判断它是否跟给定的元素相等。
在最坏的一种情况下,我们要,从数组的第一个元素,搜索到尾部找到我们需要的元素,这时候就导致了时间复杂度为n,(n为元素的数量)
也可能发现这样的情况,我们正在搜索的元素是数组的第一个元素,这时候时间复杂度为1
现在这种情况下,用big-Θ表示线性搜索的时间复杂度为Θ(n),这是一种表示平均时间复杂度的方法。很显然,在这里是不合适的,这时候我们用O(n)来表示,这意味这时间复杂度永远不会超过O(n),定义了渐近上线,也就是它可以小于或者等于n,这才是正确的表示。
在大多数情况下,你都会看到用Big-O来表示算法的复杂度,只因为它更有意义。
渐近下限:Big Omega (Ω)
其来表示任何算法的下限,或者最佳情况。
这始终表示任何算法对所有输入值所需的最短时间,因此是任何算法的最佳情况。
简单来说,当我们以big-Ω的形式表示任何算法的时间复杂度时,我们的意思是算法将至少花费这么多时间来完成它的执行。
转载请注明:第五个季节 > 数据结构与算法(二):渐近符号