视频链接:《算法不好玩》专题一
1-1初识递归
递归(Recursion)是函数自己调用自己。递归是计算机科学特有的解决问题的方法。
使用递归计算5的阶乘:
从上到下是「拆分问题」,从下到上是「组合问题的解」。
递归是先「自顶向下」,再「自底向上」
1-2栈与深度优先遍历
递归借助「栈」实现
按照「深度优先」遍历
如果原问题和子问题呈现出树形结构,拆分子问题和组合子问题的解释按照深度优先遍历(DFS)的方式进行的。从根节点开始,只要有可能继续往下走的结点,就继续走下去。直到没有可以走的结点以后,再退回来找还没有走过的结点继续走下去。
总结:
- 递归需要借助栈
- 栈的逻辑由编程语言帮助我们实现
- 是按照深度优先遍历的顺序拆分问题与组合子问题的解
1-3分治算法
- 递归是一种「自顶向下」解决问题的思路,也是「分而治之」算法思想的体现
- 告诉程序递归终止条件
1-4初始时间复杂度
时间复杂度:随着输入规模的增大,程序的运行时间增加的快慢。
(输入规模:数据的大小,通常用N表示;运行时间:也可以理解为操作次数执行算法的消耗)
举例:
复杂度分析得设计思想
- 考虑数据量特别大的时候(时间复杂度低的算法在数据量特别大的时候才会体现出来)
- 复杂度分析是事前估计(时间复杂度是不用执行程序就能对算法的运行效率进行的评估)
- 化繁为简(目的是对程序进行分类,便于人们的交流)
- 通常考虑最坏的情况
1-5时间复杂度的简单计算
1-6时间复杂度的极限定义
1-7空间不重要
- 用户只关心程序的响应速度
- 在线判题系统(Online Judge)对s时间的关注度远大于空间
- 程序运行完成后空间可以重复使用
解决问题的思路:
- 先暴力分析解法的优缺点
- 空间换时间