算法复杂度分为空间复杂度和时间复杂度。
时间复杂度:一个算法的运行快慢。
空间复杂度:一个算法运行所需的额外空间。
如今不再关注空间复杂度,因为现在的内存越来越大,成本越来越低,多一点无所谓
时间复杂度不是算时间,因为同一个算法执行环境不同,操作的机子也不是一样的,所以导致时间都不一样。
因此时间复杂度是算法中基本操作的执行次数。
算时间复杂度不需要算精确的执行次数,只要估算即可。
于是出现了大O的渐进表示法。
1:用常数1取代运行时间中的所有加法常数。
2:在修改后的运行次数函数中,只保留到最高阶段。
3:如果最高阶段存在且不是1,则去除这个次数的常数项,得到结果为大O阶。
O(1)不代表算法的运行一次,而是常数次。
当一算法随着输入不同,时间复杂度不同,看最坏情况。
递归算法的时间复杂度:递归次数*每次递归调用的次数。
空间复杂度算的是变量的个数,额外使用的空间。
空间可以重复利用,不累计。
时间是一去不复返的,累计的。
常见复杂度对比:
123456 | O(1) | 常数阶 |
5n+98 | O(n) | 线性阶 |
n^2+6n+48 | O(n^2) | 平方阶 |
5log(2)n+48 | O(logn) | 对数阶 |
2nlog(2)n | O(nlogn) | nlogn阶 |
n^3+n^2+n | O(n^3) | 立方阶 |
3^n | O(3^n) | 指数阶 |