简单来说,大O描述的是算法的运行时间和输入数据之间的关系
n代表数据的个数,时间复杂度中描述的是n趋近于无穷的情况。
O(1) 表示消耗的时间与数据的规模是没有关系的。
O(n) 说明这个算法的运行时间与数据的个数(n)呈线性关系
实际运行时间 T = c1*n + c2,c1和c2是常数,在不同的算法中是不确定的。
所以并不一定时间复杂度为 O(n)的算法运行时间就比O(n^2)的算法快:
可能 O(n):T = 2000n + 10000 O(n^2):T = 1n*n + 0
这时,当数据量小于2000时,明显O(n^2)的算法要快。
均摊复杂度:
在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。
例如,数组每次插入一个数的时间复杂度是O(1),当数组满了之后进行自动扩容一倍的时间复杂度是O(n)。如果按最坏情况分析,每次插入都进行扩容,那么插入操作的时间复杂度就是O(n)。
如果按均摊复杂度分析,比如一开始数组容量为4,那么进行4次插入操作消耗了 4 个时间。当插入第5个数时,数组扩容消耗了 4+1 个时间。也就是说,5次插入操作消耗了 9 个时间,平均每次操作的时间为 2。当数组容量为n时,n+1次插入操作触发扩容,总共消耗 2n+1 个时间。
2n+1 / n+1 平均每次操作消耗两个时间。
均摊计算后,时间复杂度为O(1),它的耗时与数据量没有关系。