Skip to main content

算法基础

⨭ 时间复杂度

类型表达式例子
常数O(1)
  • 加减乘除
  • 获取元素属性
对数O(logn)
  • 二分查找
  • 优先队列增删元素
线性O(n)
  • 遍历数组
  • 遍历链表
线性方程O(nlogn)
  • 堆排序
  • 归并排序
二次方O(n^2)
  • 遍历数组子对
  • 数字相乘
多项式O(n^c)
  • 遍历数组子对(长度不定)
  • 多重遍历
指数O(2^n)
  • 遍历所有子集合
  • 回溯算法

⨦ 排序算法

类型最好时间平均时间最坏时间空间稳定性
快速排序O(nlogn)O(nlogn)O(n^2)O(logn)不稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(n)稳定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不稳定
冒泡排序O(n)O(n^2)O(n^2)O(1)稳定
插入排序O(n)O(n^2)O(n^2)O(1)稳定
桶排序O(n)O(n)O(n^2)O(n)稳定

⦜ 数据结构

类型(平均)获取元素查找元素插入元素
数组O(1)O(n)O(n)
链表O(n)O(n)O(1)
双向链表O(n)O(n)O(1)
O(1)O(n)O(1)
O(1)O(n)O(logn)
队列O(1)O(n)O(1)
哈希表O(1)O(1)O(1)
二叉搜索树O(logn)O(logn)O(logn)
跳表O(logn)O(logn)O(logn)

⦠ 递归公式

类型T(n)例子
T(n)=T(n/2)+1O(logn)二分查找
T(n)=2T(n/2)+1O(n)二叉树遍历
T(n)=2T(n/2)+nO(nlogn)归并排序
T(n)=T(n−1)+nO(n^2)插入排序
T(n)=2T(n−1)+1O(2^n)回溯算法

⧅ 主定理

当 a≥1, b≥2, c>0 且 T(n) 在非负区间内满足 T(n) = aT(n/b)+O(nc),假定 T(0)=0,T(1)=O(1),则

类型T(n)
c<log(b)aO(n * log(b)a)
c=log(b)aO(n^c * logn)
c>log(b)aO(n^c)

⨭ 运算符优先级

基本规则

  1. 一元运算符优于二元运算符
  2. 乘除加减优于大部分运算符
  3. 位运算优于逻辑运算

Java

Java Operators

类别列表
括号()
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
判断与比较>, >=, <, <=, ==,
位运算&, ^, |, &&, ||
逻辑运算&&, ||
三元运算符? :
赋值=, +=, -=, ^=, >>=

Python

Python Expressions

类别列表
括号()
阶乘**
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
位运算&, ^, |, &&, ||
判断与比较>, >=, <, <=, ==,
逻辑运算&&, ||
赋值=, +=, -=, ^=, >>=

C++

C++ built-in operators, precedence, and associativity

类别列表
括号()
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
判断与比较>, >=, <, <=, ==,
位运算&, ^, |, &&, ||
逻辑运算&&, ||
赋值=, +=, -=, ^=, >>=

⦧ 表达式

类型表达式结果
调和级数1 + 1/2 + 1/3 … + 1/n-
自然对数(1 + 1/n) ^ ne (n→∞)
等差数列n1 + n2 + n3 + n4 … + nn * (n1 + n) / 2
等比数列n1 + n2 + n3 + n4 … + nn1 * (1 - q ^ n) / (1 - q)
卡特兰数f(n)=f(0) * f(n-1) + f(1) * f(n-2) … + f(n-1) * f(0)-

⨦ 链表

linked-list

⦜ 二叉树

⧉ 类型

类型简介节点数量树的高度
一般二叉树(Binary tree)节点数量为 N,树高度为 H每一层最大节点数量为 2^H,最底层最大节点数量为 N0 <= H <= N
完全二叉树(Complete binary tree)除了最后一层的右边,其他节点都已经填满2^(H-1) <= N <= 2^H - 10 <= H <= log(N)
满二叉树(Full binary tree)每个节点有零或者两个子节点2 * H + 1 <= N <= 2^H - 1log(N) <= H <= N/2
完美二叉树(Perfect binary tree)每个节点有零或者两个子节点且在同一层2^(H+1) - 1log(N)

binary-tree

⨦ 遍历方式

类型例子
前序遍历父节点 -> 左节点 -> 右节点
中序遍历左节点 -> 父节点 -> 右节点
后序遍历左节点 -> 右节点 -> 父节点
层序遍历第一层 -> 第二层 -> 第三层

tree-1

tree-2

⦠ 图论

类型简介
图(Graph)节点数量 V (vertice),边 E(edge) 0 <= E < V ^ 2
无向图(Undirected graph)node 节点没有方向,0 <= E < V * (V-1) / 2
有向图(Directed graph)node 节点有方向,0 <= E < V * (V-1)
简单图(Simple graph)没有自环(self loop),没有重复边的无向图
非简单图可能包含自环(self loop)和重复边
Walk节点 A 到节点 B 的路径,例如 A -> C -> D -> C -> B
Path不使用重复节点下,节点 A 到节点 B 的路径,例如 A -> C -> B
degree连接的节点数量,对于有向图包括 in-degree 与 out-degree
算法介绍允许负权重值可以检测出负权重环时间复杂度
Dijkstra单源带权重的有向图最短路径O((V+E)logV)
Bellman-Ford一般情况下的单源带权重的有向图最短路径O(VE)
Floyd-Warshall所有结点对最短路径O(V^3)