数学归纳法
- 用于证明断言对所有自然数成立
- 证明对于N=1(N=0)成立
- 证明N>1时:如果对于N-1成,那么对于N成立
- 求证:1 + 2 + 3 + … + n = n * (n + 1) / 2
- 1 = 1 * (1 + 1) / 2
- 如果 1 + 2 + 3 + … + n - 1 = (n - 1) * n / 2
- 那么 1 + 2 + 3 + … + n = 1 + 2 + 3 + … + (n - 1) + n = (n- 1) * n / 2 = (n * (n - 1) + 2n) / 2 = n * (n + 1) / 2
- 数学归纳法的正确性
- 公理
递归控制
- 递归书写方法:
- 严格定义递归函数作用,包括参数,返回值,Side-effect(副作用)
- 先一般,后特殊
- 每次调用必须缩小问题规模
- 每次问题规模缩小程度必须为1
循环控制
- 不要尝试递归→非递归
- 一般化的方法仍需使用栈
- 代码复杂
- 不能根本解决问题
- 循环不变式(loop invariant)
- 是一句断言定义各变量所满足的条件
- 循环书写方法
- 定义循环不变式,并在循环体每次结束后保持循环不变式
- 先一般再特殊
- 每次必须向前推进循环不变式中所涉及的变量值
- 每次推进的规模必须是1
边界控制
- 二分查找思路
- 规定要查找的值k可能在的数组arr内下标区间a,b
- 计算区间a,b的中间点m
- 若k<arr[m],将区间缩小为a,m,继续二分查找
- 若k>arr[m],将区间缩小为m,b,继续二分查找
- 若k==arr[m],则找到元素位于位置m
- 在计算中点m,使用(a + b) / 2时,a + b可能会发生溢出,所以要采用a + (a - b) / 2
数据结构
- 线性结构
- 数组
-链表
-队列,栈
- 数组
- 非线性结构
- 树
- 二叉树
- 搜索树
- 堆/优先队列
- 图
- 无向图
- 有向图
- 有向无环图
- 图的算法
- 深度优先遍历
- 广度优先遍历
- 拓扑排序
- 最短路径/最小生成树
- 树
算法复杂度
- O(N!),O(2N),O(N2),O(NlogN),O(N),O(logN),O(1) …
- 代表最坏情况用时