一 序
虽然是在b站看的视频,但是说真的感受老师讲的真好,后面还是要去反复学习下。因为算法是大厂必考的,老师没有吹嘘哪些NB之处,而是实在的说明,时间复杂度和空间复杂度,这是任何AI工程师必须要深入理解的概念。就是你不光要读论文仰望星空,还是要脚踏实地,把实际遇到的问题工程能力落到实处。
二 时间复杂度
不从数学角度来看公式推导 ,不考虑前面的系数。
- O(1):Constant Complexity 常数复杂度
- O(log n):Logarithmic Complexity 对数复杂度
- O(n):Linear Complexity 线性时间复杂度
- O(n^2):N Square Complexity 平方
- O(n^3):N Square Complexity 立方
- O(2^n):Exponential Growth 指数
- O(n!):Factorial 阶乘
如果不是NLP课程,单纯是算法的话,那么首推极客时间的覃超老师的算法训练营。
三 归并排序
算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法。
分治模式在每一层递归上有三个步骤:
- 分解(Divide):将n个元素分成个含n/2个元素的子序列。
- 解决(Conquer):用合并排序法对两个子序列递归的排序。
- 合并(Combine):合并两个已排序的子序列已得到排序结果。
分到一定细度的时候,每一个部分就只有一个元素了,那么我们此时不用排序,对他们进行一次简单的归并就好了。
看着比较简单,代码写起来不一定简单。感兴趣的自己动手试试吧。
根据上面的思路: 时间复杂度T(N)= 2 T(N/2)+N. 最后这个N是因为合并的时候,每个数字都要从两个子序列去比对一次。
下面是根据主定理去计算下归并排序的时间复杂度。
主定理(Master Theorem):
网上找了个计算过程,a=2,b=2,k=0 .属于第二种情况,代入计算即可。
四 斐波那契数列
Fib:0,1,1,2,3,5,8,13,21,…
- F(n) = F(n-1) + F(n-2)
观察图,发现的规律:
- 每展开一层,运行的节点数就是上层的两倍,按指数级递增(从根节点开始算起)
- 存在重复计算的节点
如果 使用哪个默认的递归且无优化的情况,时间复杂度就是O(2^n),空间复杂度就是状态树的深度O(N).
如果使用了DP方式:(dp用了一维数组来实现)
那么 时间复杂度是: O(n)
空间复杂度:数组的长度O(n)
老师这里花了半小时,分别从时间复杂度(树)、空间复杂度(stack)展开去讲.
五 NP问题
从时间复杂度来看,p^N属于指数型。这种是不可求解的。
那么需要需要近似算法,转换为N^p这种多项式问题(这种是可解决的),需要理解这种的时间复杂度,一级这种近似算法与理论算法差值。