时间复杂度通常用O表示,例如:
O(1)计算出答案的时间是一个常数
O(logn)计算出答案的时间随着问题规模的增大是按照log规律增大的(由于log的底数对结果影响很小,所以忽略底数,统称log) O(n)计算出答案的时间随着问题规模的增大是线性增大的
O(nlogn)计算出答案的时间随着问题规模的增大是按照nlog的规律增大的
O(n2)表示能在计算出答案的时间随着问题规模的增大是按照平方的规律增大的
计算复杂度的时候可能一个代码的各个部分的复杂度不一样,例如一个程序计算出答案的时间是2n3 + n + 1,计算它的复杂度时只关注影响最大的部分,即复杂度为O(n3)
通常情况下,算法的设计是从数据范围出发,根据数据范围里面最坏的情况确定用什么复杂度的算法再去思考如何解决问题。
例如,数据范围是107范围,那么你就只能从O(n)、O(logn)、O(1)的算法中选择
如果数据范围是1000,则首先考虑O(n2)的算法。
log底数影响还是很大的,在40万数据的时候,2位底,nlogn 复杂度是40乘19 约等于 8千万,10为底,nlogn 复杂度40 乘5 约等于 2千万
是800万和200万吧,多算了一位
还要考虑算法的常数时间 即实际执行次数 比如累加求和是O(n)的但常数时间只有一次 这里1s执行次数我可以到1e9 但常数时间较大 就如y总的时间复杂度总结一样 以1e7~1e8最稳妥 以及nlogn还要考虑回溯的常数时间
总结的很好