![v2-d0df910cfb6a7811e059c715b6a6a44c_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=658bc88a-ff2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d0df910cfb6a7811e059c715b6a6a44c_1440w.jpg?source=172ae18b)
类型一(快速排序 & 归并排序)
- 快速排序
quick_sort
时间复杂度分析:
注意:p = partition(a, l, r)这里的时间复杂度为O(n) 最好情况:每次都是二分,T(n) = 2*T(n/2) + O(n) = O(nlogn) 最坏情况:每次划分出一个数值,T(n) = T(n-1) + T(1) + O(n) = O(n^2) 一般情况:不平衡分割,T(n) = T(n/10) + T(9n/10) + O(n) = O(nlogn)
空间复杂度分析(考虑递归深度):
最好情况:每次都是二分,O(logn) 最坏情况:每次划分出一个数值,O(n)
- 归并排序
merge_sort(a, l, r):
m = l + (r - 1)/2
merge_sort(a, l, m)
merge_sort(a, l+1, m)
merge(a, l, m, r)
时间复杂度分析:
归并排序每次都是二分,T(n) = 2*T(n/2) + O(n) = O(nlogn)
空间复杂度分析(考虑递归深度):
递归深度是log(n)
merge(a, l, m, r)需要额外的空间,但是它是临时使用的
空间复杂度是O(logn + n)
- 总结
由于快速排序没有数组的拷贝,所以空间复杂度低,同时在一般情况中的事件复杂度也是有良好的表现,所以快速排序应用的更为广泛
类型二(二分查找 & 二叉树中序遍历)
- 二分查找
binary_research
时间复杂度分析:
每次都是二分,T(n) = T(n/2) + O(1) = O(logn)
空间复杂度分析(考虑递归深度):
O(logn)
- 二叉树中序遍历
inorder
假设是完美二叉树
时间复杂度分析:
最好的情况下:每次输入规模减半,T(n) = 2*T(n/2) + O(1) = O(n) 最差的情况下:二叉树只有左子树(相当于逐个遍历),T(n) = T(n-1) + T(1) + O(1) = O(n)
空间复杂度分析(考虑递归深度):
最好的情况下:O(logn) 最差的情况下: O(n)
- 对比总结
- 类型一和类型二的区别是中间有没有O(n)的操作
- 递归函数的每一步都很重要,如果多做了一点,很可能最后的结果和线性没有区别
类型三(组合 & 排列)
- combination
commbination
时间复杂度分析:
每个数字有两种情况,取或者不取,T(n) = O(2^n)
空间复杂度分析(考虑递归深度):
O(n)
- permutation
permutation
时间复杂度分析:
T(n) = n*T(n-1) = O(n!)
空间复杂度分析(考虑递归深度):
O(n)
记忆递归
- fibonacci_origin
fibonacci
时间复杂度分析:
T(n) = T(n-1)+T(n-2)+O(1)
2T(n-2)<T(n)<2T(n-1)
T(n) = O(2^n)
实际上是O(1.168^n)黄金比例
空间复杂度分析(考虑递归深度):
O(n)
- fibonacci_memorization
fibonacci_memorization
时间复杂度分析:
O(n)
空间复杂度分析(考虑递归深度):
记忆深度和递归深度都是O(n)
//TODO leetcode741 & leetcode312
参考文献
花花酱 LeetCode Time/Space Complexity of Recursive Algorithms - 刷题找工作 SP4_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com![v2-36c1ba4c69103a008ced5788f6c26271_180x120.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=658bc88a-ff2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-36c1ba4c69103a008ced5788f6c26271_180x120.jpg)