先附上个人认为还不错的文章

算法的时间与空间复杂度(一看就懂) - 知乎 (zhihu.com)

时间复杂度

个人认为所谓时间复杂度就是代码所执行的次数,次数越少就性能越好

推算时间复杂度有一个方法叫推导大O阶方法

这玩意有三种方式

1.用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高阶项

3.如果最高阶项存在且系数不是1,则去除与这个项相乘的系数。

下面的案例,它的执行次数是1+n+n*n + n(n+1)/2,按照推导大o阶法,时间复杂度就是n*n

n++ //执行一次
callback(n) //执行n次
for(i=0;i<n;i++)//执行n*n次
{
callback(i)
}
for(int i=0;i<n;i++)//执行n*(n+1)/2次
{
for(int j=i;j<n;j++)
{

}
}

常见的时间复杂度

执行函数 非正式术语
66 1 常数阶
n+1 n 线性阶
n*n+n+1 n*n 平方阶
log2n+1 logn 对数阶
nlog2n+1 nlogn nlogn阶
n*n*n+n*n+n+1 n*n*n 立方阶
2的n次方 2的n次方 指数阶

 

常用时间复杂度所消耗的时间从小到大依次是:1<logn<n<nlogn<n*n<n*n*n<2的n次方,这里所谓的排序并不是一定的,它会随着运行的次数根据阶级从而增加越快。

空间复杂度

空间复杂度其实就是这个算法中消耗了多少的内存,也就是有多少东西产生了。