先附上个人认为还不错的文章
算法的时间与空间复杂度(一看就懂) - 知乎 (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次方,这里所谓的排序并不是一定的,它会随着运行的次数根据阶级从而增加越快。
空间复杂度
空间复杂度其实就是这个算法中消耗了多少的内存,也就是有多少东西产生了。
这里是有hi地区,一位独立游戏业余开发者