brute-force
- 枚举:遍历解空间
- 倍增:保存 $2^i$ 处的解用于构造所有情况
- 递归:原问题划归到一个子问题
- 搜索:建立树/图模型,以一定次序穷举
- 模拟
- 剪枝:利用数学性质缩小解空间
- 前缀和、差分
- 打表:将不同问题的解储存
Divide and Conquer
分治法
def Divide_and_Conquer(A):
if (smallenough) return Conquer()
Divide_and_Conquer(A_left)
Divide_and_Conquer(A_right)
Merge(A_left, A_right)
Examples:
- 归并排序: $T(n)=2T(n/2)+\Theta(n)$
- 快速排序:
- 和最大子数组: $T(n)=2T(n/2)+\Theta(n)$
- 矩阵乘法:$T(n)=8T(n/2)+\Theta(n^2)$
- strassen’s algorithm: $T(n)=7T(n/2)+\Theta(n^2)$
二分法
- 无 merge 的分治法
- 问题已有序关系
// 左闭右闭
int i_left = 0, i_right = len;
while (i_left <= i_right){
int i = (i_left + i_right)/2;
if (isleft(i_left, i)) // do something
else if (isright(i, i_right)) // do somethin
else // do something
}
动态规划
- 子问题图:顶点为子问题,边为可能选择
- 实现方法
- top-down with memorization(记忆化搜索)
- bottom-up method
- 动态规划过程
- Define structure of subproblem
- Set the goal
- Identify the recurrence -> make choice(binary/multi-way)
- from small to large
- init condition
- Write pseudo-code
- Analyze the time complexity
- Extract the optimal solution
- optimal substructure: 问题的最优解由子问题的最优解组合而成,而这些子问题可以独立求解
- make a decision
- 子问题无关
- cut-and-paste: 任意其它子问题的方案可被最优方案替代
- overlapping subproblem: 问题的递归算法会反复地求解相同的子问题
Examples:
- 1D subproblem (array,sequence,string->prefix/suffix,O(n))
- Rod cutting:$f(n)=\max_{1\leq i\leq n}(p_i+f(n-i))$
- Longest increasing subsequence:$L(n)=1+\max_{j<i\wedge A[j]\leq A[i]}L(j)$
- $E(l)=\min(ending), O(nlogn)$
- Printing Neatly
- 2D subproblem
- Edit distance
- Longest common subsequence
- Matrix chain multiplication: $f(i,j)=\min_{i\leq k<j}(f(i,k)+f(k,j)+p_{i-1}p_kp_j)$
- Optimal BST: $\min_{i\leq r\leq j}{e[i,r-1]+e[r+1,j]+w(i,j)}$
- Knapsack Problem
- 3D subproblem
- Floyed-Warshall algorithm
- Graph
- rooted subtrees
- nodes after/before in the topo order
优化
- 空间优化:高维动归,通过改变求解问题次序,减少空间
贪心
- optimal substructure
- by greedy, only one subproblem remains
- Greedy-Choice Property: 最优解可通过局部最优解构建(存在一种最优的划分子问题方案)
- Exchange Argument
- Matroid: $M=(S,I)$
- Definition
- finite $S$, $I\subseteq \rho(S)$
- hereditary $I$: $B\in I,A\subset B,A\in I$
- exchange property: $A,B\in I,|A|< |B|,\exists x\in B-A,A\cup{x}\in I$
- extension of $A$: $A\cup{x}\in I$
- maximal: no extensions
- weighted: $w(A)=\sum_{x\in A}\omega(x)$
- Definition
- Finding maximum-weight independent subset in a weighted matroid
- define independent
def greedy(M, w)
A = set()
sort(M.S, key=w) # O(nlgn)
for x in M.S:
if A + {x} in M.I: # O(f(n))
A += {x}
return A
Examples:
- activity-selection problem
- fractional knapsack problem
- huffman codes
- scheduling unit-time tasks with deadline and penalties for a single processor