无序数组的插入:常数
无序数组的插入是我们到现在为止所见过的算法中唯一一个与数组中的数据项个数无关的算法。新数据项总是被放在下一个有空的地方,无论nElems如何增加,无论数组中的数据项个数N有多大,一个插入总是用相同的时间,我们可以说向一个无序数组中插入一个数据项的时间T是一个常数K:即 T=K
在现实情况中,插入所需的实际时间与以下这些因素有关,微处理器,编译程序生成程序代码的效率,等等,上面等式中的常数K包含了所有这些因素,在现实情况中得到K的值,需要测量一次插入所花费的时间,K就等于这个时间。
线性查找:与N成正比
在数组数据项的线性查找中,我们已经发现特定数据项所需的比较次数平均为数据总数的一半,因此设N为数据项总是,搜索时间T与N的一半成正比:T=K*N/2
同插入一样若要得到方程中K的值,首先需要对某个N值(有可能很大)的查找进行计时,然后用T来计算K。当得到K后便可以对任意N的值来计算T。
将2并入K可以得到一个更加方便的公式。新K值等于原先的K除以2,新公式为:T=K*N
这个方程说明平均线性查找时间与数组的大小成正比,即如果一个数组增大两倍,所花费的查找时间也会相应的增长为两倍。
二分查找:与log(N)成正比
同样我们可以为二分查找制定一个与T和N有关的公式:T=K*log2(N)(log以2为底N的对数)和前面所说的,时间T与以2为底N的对数成正比。实际上由于所有的对数都和其他对数成比例(从底数位2转换到底数位10需乘以3.332),我们可以将这个为常数的底数也并入K。由此不必指定底数:T=K*log(N)
不要常数
大O表示法同上面的公式比较类似,但他省去了常数K。当比较算法时,并不在乎具体的微处理器芯片或编译器,真正需要比较的是对应不同的N值,T如何变化的,而不是具体的数字,因此不需要常数。
大O表示法使用大写字母O,可以认为其含义是“order of”(大约是)。我们可以使用大O表示法来描述线性查找使用了O(N)级时间,二分查找使用了O(logN)级时间。向一个无序数组中的插入使用了O(1),或常数级时间。
用大O法表示运行时间
- 线性查找 O(N)
- 二分查找 O(logN)
- 无序数组的插入 O(1)
- 有序数组的插入 O(N)
- 无序数组的删除 O(N)
- 有序数组的删除 O(N)
表中的O(1)表示优秀,O(logN)是良好,O(N)是还可以,O(N2)则差一些,大O表示法的实质并不是对运行时间给出实际值,而是表达了运行时间是如何受数据项个数影响的,除了实际安装后真正去测量一次算法的运行时间外,着可能是对算法进行比较的最有意义的方法了。