Alg.20.算法概述

@todo:

  • 算法设计: 排序, 贪心, 分治, 动态规划, 回溯, 随机化
  • 数学基础: 二分查找, 欧几里得算法, 快速幂算法
  • 字符串匹配算法: KMP
  • 图论算法:
    • 拓扑顺序
    • 最短路径: Dijkstra算法, Floyd-Warshall算法
    • 最小生成树: Prim, Kruskal
  • 搜索算法: BFS, DFS, A*搜索
  • 几何算法: 向量, 凸包
  • 快速傅里叶变换(FFT): 离散傅里叶变换

复杂度分析

几何级数 & 算数级数

  • 几何级数: $$ 1 + 2^1 + 2^2 + … + 2^N = 2^(N+1) -1 ≈ 2^N $$
  • 算术级数: $$ 1 + 2 + 3 + … + N = N(N+1)/2 ≈ N^2/2 $$

复杂度表示法

▶ 大O符号(英语:Big O notation) 用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。
设函数 $f(n)$ 代表某一算法在输入大小为n的情况下的工作量(效率),
我们将 $f(n)$ 与另一行为已知的函数 $g(n)$ 进行比较,
如果存在正数 C 和 n0,使得对于一切 $ n >= n0 $ 有: $ 0 <= f(n) <= C g(n) $,
则可以称 $f(n)$ 的渐进上界是 $g(n)$,记做 $ f(n) = O(g(n)) $,

▶ 小O符号: 类似大O,也用来表示「渐近上界」,
对于任意正数 C 和 n0,使得对于一切 $ n >= n0 $ 有: $ 0 <= f(n) < C g(n) $,
则可以称 $f(n)$ 的渐进下界是 $g(n)$,记做 $ f(n) = o(g(n)) $。
注意与大O定义的不同:

  • 大O:「只要存在一个正数C」以及 $ f(n) <= C g(n) $。
  • 小O:「任意正数C」以及 $ f(n) < C g(n) $。
  • 两者都描述上限,但小O是更强有力的陈述,如果f∈o(g),则f和g的增长率之间的差距比f∈O(g)时大得多。

例如, $ f(n) = n^2 + n $,则 $ f(n) $ 的复杂度可以记为 $ o(n^3) $

Big-O

▶ 大Ω符号,读音:big omega,用另一个(通常更简单的)函数来描述一个函数数量级的「渐进下界」。
如果存在正数 C 和 n0,使得对于一切 $ n >= n0 $ 有: $ 0 <= C g(n) <= f(n) $,
则可以称 $f(n)$ 的渐进下界是 $g(n)$,记做 $ f(n) = Ω(g(n)) $

big-omega

@ref: 007函数的渐近的界 - 算法基础 | Coursera

常用算法复杂度分析

算法中 $log$ 级别的时间复杂度都是由于使用了分治思想, 这个底数直接由分治的复杂度决定:

  • 如果采用二分法, 那么就是 $log_2n$, 三分法就是 $log_3n$, 其他亦然;
  • 不过无论底数是什么, 对数函数的渐进趋势是一样的, 所以通常忽略底数只用 $logn$ 表示;

场景复杂度的增长趋势如下图: $O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)$

时间复杂度增长趋势

排序算法复杂度

Sorting_Algorithms_Complexity

数据结构复杂度

Common_Data_Structure_Operations

Big-O Cheat

bigocheatsheet

@ref:: Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!) @ericdrowell

算法设计

贪婪

分治

回溯

@todo

动态规划

图论算法

深度优先 & 广度优先

@todo

拓扑排序

@todo

最短路径算法

@todo

无权最短路径

@todo

Dijkstra算法

@todo

网络流问题

@todo

最小生成树

@todo