大O表示法

大O表示法


汽交按尺寸被分为若干类、微型、小型、中型等等。在不提及具体尺寸的情况下,这些分类可以为我们所涉及到车的大小提供一个大致慨念。我们同样也需要一种快捷的方法来评价计算机算法的效率,在计算机科学中,这种粗略的度量方法被称作“大o”表示法。在比较算法时似乎应该说一些类似“算法A比算法B快两倍”之类的话,但实际上这类陈述并没有多大意义。为什么?这是由于当数据项个数变化时,对应的比例也会发生根本改变。有可能数据项增加了50%,则A就比B快了三倍。或有可能只有一半的数据项,但现在A和B的速度是相同的。我们所需的是一个可以描述算法的速度是如何与数据项的个数相联系的比较。下面是我们目前所见过的算法大o表示。
无序数组的插入;常数
    无序数组的插入是我们到现在为止所见过的算法中唯一一个与数组中的数据项个数无关的算法;新数据项总是被放在下一个有空的地方,a[nElems],然后nElems增加。无论数组中的数据项个数N有多大,  一次插入总是用相同的时间。我们可以说向一个无序数组中插入—个数据项的时间T是一个常数K:
    T=K
    在现实情况中,插入所需的实际时间(不管是微秒还是其他单位)与以下这些出素有关:微处
理器,编译程序生成程序代码的效率,等等。  上面等式中的常数K包含了所有这些因素。在现实际情况要得到K的值,需要测量一次插入所花费的时间。(软件就是为了这个目的们存在的。)K就等于这个时间。
线性查找:与N成正比
    T=K*N/2
    将2并入K可以得到一个更方便的公式。T=K*N
二分查找:与log(N)成正比
    同样,我们可以为二分查找制定出一个与T和N有关的公式:
    T=K*log (N)
    正如前面所提到的,时间T与以2为底N的对数成正比。实际上,由于所有的对数都和其他
对数成比例(从底数为2转换到底数为10需乘以3、322),我们可以将这个为常数的底数也并入K。
由此不必指定底数:
    T=K*log(N)
不要常数
    大o表示法同上面的公式比较类似,但它省去了常数k。当比较算法时,并不在乎具体的微处
理器芯片或编译器;真正需要比较的是对应不同的N值,T是如何变化的,而不是具体的数字。因
此不需要常数。
    大o表示法使用大写字母o,可以认为其含义是“order of(大约是)。我们可以使用大o表示
法来描述线性查找使用了o(N)级时间,二分查找使用了o(logN)级时间。向一个无序数组中插入
使用了o(1)。(小括号中是数字1。)
线性查找                          o(N)
二分查找                          o(logN)
无序数组的插入                    o(1)
有序数组的插入                    o(N)
无序数组的删除                    o(N)
有序数组的删除                    o(N)
  大o表示法的实质并不是对运行时间给出实际值,而是表达了运行时间是如何受数据项个数所
影响的。除了实际安装后真正去测量一次算法的运行时间之外,这可能是对算法进行比较的最有意
义的方法了。

猜你喜欢

转载自rainyear.iteye.com/blog/1404868