基本概念
算法的复杂度通常使用O(1), O(n), O(logn), O(nlogn)来表示,即可以表示时间复杂度也可以表示空间复杂度。
大O加上(),里面其实包裹的是一个函数f(),O(f()),指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。
说明 (备注:n是数据量增大倍数)
O(1)
复杂度最低,为常量级,时间消耗与数据量大小无关
O(n)
耗时随着数据量增大而增大
O(n^2)
耗时为n*n
O(logn)
随着数据量增大,耗时增大倍(m为底n的对数倍),底数m不固定,由分治的复杂度决定,如二分法就会以2为底数,三分法就会以3为底数。(例如,以2为底,n=256,得出耗时增加8倍)
O(nlogn)
随着数据量增大,耗时增加倍(例如底数为2,数据量增加n=256倍,耗时增加256*8倍),这个复杂度高于线性低于平方,归并排序就是这个时间复杂度。
复杂度与算法举例
数组:连续的内存空间,对于指定下标的查找,时间复杂度为O(1);通过给定值查找需要遍历数组逐一对比,时间复杂度为O(n),如果是有序数组可以通过采用二分查找、插值查找、斐波那契查找等方式将查找复杂度提高为O(logn);对于一半插入删除操作,会移动数组元素,其平均复杂度也为O(n)
二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)
哈希表:相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1),后面有专门文章来介绍强大的哈希表。