1.时间复杂度
认识时间复杂度:常数时间的操作
什么是常数操作?
一个操作如果和样本数量没有关系,每次都是固定时间内完成的操作,就叫做常数操作。
时间复杂度为一个算法流程中,常数操作数量的一个指标。常用o(读作big o)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。
评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。
big O
大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。
但是我们依然可以说的O代表的就是一般情况,而不是严格的上界。
在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下部分如果为f(N),那么时间复杂度为o(f(N)).
所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示:
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶
举例
int a = arr[i]; 这是常数操作,因为与arr的数据量无关,只是对arr的第i个数进行寻址
加减乘除,位运算都是常数操作
假设有一个链表,int b = list.get(i); 而不管是单链表还是双链表,都是一个扣一个,每次都需要遍历,时间并不固定。
2.空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,
空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:
额外空间复杂度o(1):如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
额外空间复杂度o(N):需要开辟额外原来的数据量等规模的空间大小。