算法导论梳理

参考资料

公开课 6.046J Design and Analysis of Algorithms (Spring 2015)
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2015/

书籍 Introduction to Algorithm (淘宝打印)

算法复杂度 http://bigocheatsheet.com/

基础知识

五种渐进标记 O, o, $\theta$, $\omega$, $\Omega$.
主定理 (用于辅助判断递归方程的时间复杂度)

coding 基础知识

常见 bit operation

基本思想

分治
贪心

递归

宏观原则: 把一个N规模的问题的求解,转换成若干个规模小于N的问题的求解。
不断递归之后,最终求解的问题规模会变成1,求解会非常简单。

八皇后问题
2-SUM
3-SUM
Median of Median

随机算法

引入伪随机数或随机数的概率算法。
Miller-Rabin 素数测试
其他算法导论示例。

常见排序算法

  1. 快速排序 双指针 pivot
  2. 冒泡排序
  3. 选择排序
  4. 归并排序(Merge sort)

线性时间的排序算法

  1. 计数排序(Counting Sort)
  2. 基数排序(Radix Sort)
  3. 桶排序

高级数据结构

优先队列(堆)

优先队列是一种功能上的概念,而堆则是优先队列的实现。

  1. 二叉堆 (Binary Heap) SIFT UP, SIFT DOWN …etc
  2. 二项堆 (Binomial Heap)
  3. Fibonacci 堆 (Fibonacci Heap)

https://www.youtube.com/watch?annotation_id=annotation_4022677991&feature=iv&src_vid=d3qd_wQdYqg&v=MiyLo8adrWw

二叉搜索树(BST)

  1. 二叉搜索树
  2. 红黑树

RB-tree 程序仿真 可视化
http://www.cs.armstrong.edu/liang/animation/web/RBTree.html
http://gauss.ececs.uc.edu/RedBlack/redblack.html

红黑树是平衡的二叉搜索树,注意红黑树的5个基本性质。

并查集 (Union-Find)

暂略。

动态规划 (Dynamic Programming)

动态规划的核心是状态转移方程,另一个重要思想是 Memoization .

背包问题(背包九讲)

图算法

图遍历

  1. 深度优先搜索(DFS) 开始时间结束时间标记,拓扑排序,强联通分量
  2. 广度优先搜索(BFS)

拓扑排序就是 按 结束时间逆序。
强联通分量则是按 开始时间 结束时间 是否包含在另一个 点的开始时间,结束时间的区间内。

最小生成树 (Minimum Spanning Tree)

  1. Prim
  2. Kruskal

最短路径

最短路径算法的核心思想是 Relaxation

  1. Dijkstra
  2. Floyd-Warshall 可以有负边,不可有负环,本质是一个DP
  3. Bellman-Ford 一直可检测负环

树遍历

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历

网络流

最大流最小割定理(Min cut/Max flow)

Ford-Fulkerson (根据字典序DFS选择増广路径)
Edmonds-Karp (每次在残余网络 Residual Network 选择 hops 数 最短的 増广路经 Argumented Path )

2d-match (二分匹配问题 boy meet girl) 可用该方法解决。

数论

可以在现代密码学中再次复习。

中国剩余定理
生日悖论

线性规划

NP完全问题

NP问题是图灵机的计算模型中能解决的问题的一种,在图灵机上课解的问题,依据其计算复杂度,可以归为如下若干类 P, NP, PSPACE, EXPTIME, EXPSPACE …
https://en.wikipedia.org/wiki/PSPACE
并且,并非所有问题都是图灵机可以计算出结果的,存在着一部分物理体系或者其他问题,它们无法用图灵机的有限步运算步骤进行模拟和重现,即存在图灵不可计算的物理现象。

实际中可能遇到较少。

P : 存在一种算法能在 多项式时间内 告诉你结果的问题。
NP (Nondetermistic Problem): 如果你随便猜测一个输入,存在一种算法,能在多项式时间内告诉你,这个输入是正确的还是错误的。(但这个算法不能直接解决问题)
NP-hard: 所有比NP问题更困难的问题都是 NP-hard的问题,但一个NP-hard问题不一定是一个NP问题,它可能是一个PSPACE的问题,或者更困难。
NPC (NP Complete): NP问题中最困难的问题, 处于NP与PSPACE的边界,是一个NP问题。

常见 NPC 问题

  1. SAT
  2. 3SAT
  3. ILP (Integer Linear Programming)
  4. 3D-match
  5. ZOE (Zero One Equation)
  6. Subset Sum
  7. Vertex Cover
  8. Independent Set
  9. Clique
  10. Set Cover
  11. Hanmiltonian Path
  12. TSP

证明一个问题P是NPC

  1. 证明该问题是NP
  2. 证明该问题是NP-hard

证明该问题是 NP -> 找到一个 polynomial时间 的 verifier.
证明该问题是 NP-hard -> i将一个 已知的 NPC 问题 reduce 到该问题P。 转化已知问题的输入到P的输入,转化时间也必须是 polynomial的。

数据结构实现

TastyLib https://github.com/stevennL/TastyLib

Java代码实现
https://github.com/kdn251/interviews