在算法解题中要知道一个算法的优劣可以从时间复杂度与空间复杂度去衡量,那么如何去看时间复杂度以及空间复杂度呢
#时间复杂度
在数学中存在函数的概念,比如幂函数:
时间复杂度其实可以通过函数来表示,比如
#什么是
在维基中的定义是:
大O符号是一种数学符号,它描述了当参数趋向于特定值或无穷大时函数的限制行为
比如一个函数可以表示为
常见的时间复杂度量级有
在这些时间复杂度量级中对
#
二分查找
例如:给定一个升序数组[1, 2, 4, 8, 10, 19],找到目标值10在数组中的位置
一般通过最左边和最右边的值,然后判断中间的值是大于目标元素还是小于目标元素,然后不断缩小范围
为什么说这个算法的时间复杂度为
在二分查找中每次都是查找数值的一半,假设最差情况下需要查找x次,一共有n个数值,那么这个函数为
按理说这个时间复杂度应该是
#
快排
基本思路可以参考JS描述系列之排序算法(opens new window)
如何得出的解法看知乎的这篇回答(opens new window)
下面是我根据文章内的公式自己理了一下:
公式:f(n) = f(i) + f(n - i - 1) + n,i代表左边lesser个数,i从0到n - 1都可能存在,因此 f(i) =
根据1式乘以n得到2式
根据2式得出3式
2式减去3式得出4式
可以忽略常数项2同时除以
从5式进行推导
...
然后把这些算式代入5式中得出6式
#空间复杂度
空间复杂度也是用
常见的空间复杂度量级有
#几个疑问
#递归的时间复杂度
给定的公式为 递归的次数 * 每次递归中的操作次数
以斐波那契的递归为例
function fib(n: number): number {
if (n === 0) {
return 0
}
if (n === 1) {
return 1
}
return fib(n - 1) + fib(n - 2)
}
2
3
4
5
6
7
8
9
10
11
可以看出来这个函数为
每次递归执行相加操作,为O(1)
其实查看递归的次数可以使用数学方法证明
根据1式可以得出2式,其实c为常量
根据2式进行推导:
把上述推导结论代入2式中得出3式
因此一共递归了
那么该递归的时间复杂度为
#递归的空间复杂度
给定的公式为 递归深度 * 每次递归的空间复杂度
以上面的斐波那契为例:深度为
#总结
初步了解了如何看时间复杂度和空间复杂度,以后刷题的时候可以多多总结,知道自己解法的优劣