排序算法
|
平均 |
最好 |
最坏 |
辅助空间 |
稳定性 |
概述 |
冒泡排序 |
O(n2) |
O(n) |
O(n2) |
T(1) |
稳定 |
扫一遍移动当前已知最大元素与下一元素交换 |
简单选择排序 |
O(n2) |
O(n2) |
O(n2) |
T(1) |
不稳定 |
第 i 次选择剩余最大值与第 i 个元素换位 |
插入排序 |
O(n2) |
O(n) |
O(n2) |
T(1) |
稳定 |
拿出当前元素,挨个尝试往前放置找到合适位置 |
希尔排序 |
|
O(n) |
|
T(1) |
不稳定 |
步长从 2n 到 1 进行直接插入排序 |
归并排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
T(n) |
稳定 |
递归将左右两个已经排序的序列合并成一个序列 |
快速排序 |
O(nlogn) |
O(nlogn) |
O(n2) |
T(logn)∼T(n) |
不稳定 |
选择基准值后分段递归处理。具体就是用两个指针扫,二者都不合法就交换,直到相遇 |
计数排序 |
O(n+V) |
O(n+V) |
O(n+V) |
T(n+V) |
稳定 |
丢到桶里,求桶的前缀和,按原序列倒序分配排名保证稳定性 |
基数排序 |
O(kn+∑Vi) |
O(kn+∑Vi) |
O(kn+∑Vi) |
T(n+k) |
稳定 |
从低位到高位逐一做稳定排序,一般结合计数排序 |
其中,『稳定性』是指:若两元素大小相等,排序前后两元素相对位置不变,则称该排序算法稳定。
数学杂项
阶乘
lnn!≈nlnn
康托展开 / 变进制数
给定变进制数,求其排名。公式为:1+i=1∑nAi×(n−i)!,其中 Ai 表示在 i 右侧的比 ai 小的数的个数。用树状数组维护一下前(后)缀和。时间复杂度 O(nlogn)。
理解:模板题题解。其实就是对于每个位置考虑如果 i 前面每个位置都一样,到第 i 位开始出现区别有多少种排列。所以是 i 位能放的小于 ai 的数的个数乘一个排列数。
逆康托展开就 −1 之后每次除一下阶乘(n!→1!),依次商就是 Ai ,余数重复操作。得到 Ai 就依次尝试填一下。权值线段树 + 二分做到 O(nlogn),树状数组 + 倍增是 O(nlog2n) 但是常数小。
同底数取模快速幂
ab=abmods×a⌊sb⌋,其中 s 取 p+1。预处理复杂度 O(p),询问 O(1)。
平方和、立方和公式
平方和公式:∑i=1ni2=6n(n+1)(2n+1)。
立方和公式:∑i=1ni3=4n2(n+1)2。
距离表示方法
欧几里得距离
点 A(x1,y1) 与点 B(x2,y2) 的距离 ∣AB∣=(x2−x1)2+(y2−y1)2。
曼哈顿距离
点 A(x1,y1) 与点 B(x2,y2) 的距离 ∣AB∣=∣x1−x2∣+∣y1−y2∣。
切比雪夫距离
点 A(x1,y1) 与点 B(x2,y2) 的距离 ∣AB∣=max{∣x1−x2∣,∣y1−y2∣}。
曼哈顿距离与切比雪夫距离的互相转化
原坐标系中的点 (x,y) 变换成新坐标系中的点 (x+y,x−y),原坐标系的曼哈顿距离 = 新坐标系的切比雪夫距离。
原坐标系中的点 (x,y) 变换成新坐标系中的点 (2x+y,2x−y),原坐标系的切比雪夫距离 = 新坐标系的曼哈顿距离。
博弈论
博弈图
- 无后继的状态为必败态。
- 必胜态有至少一个后继必败。
- 必败态所有后继必胜。
如果博弈图是一个 DAG,则在绘出博弈图的情况下用 O(N+M) 的时间得出每个状态是必胜状态还是必败状态。
Nim 游戏与 Nim 和
Nim 游戏:n 堆物品,每堆有 ai 个,两个玩家轮流取走任意一堆的任意个物品,不能不取。没有物品取的玩家判负。
Nim 和:定义 Nim 和 =a1⊕a2⊕⋯⊕an。当且仅当 Nim 和为 0 时,该状态为必败态;否则该状态为必胜态。
有向图游戏与 SG 函数
有向图游戏:DAG 的起点上有一个棋子,两个玩家轮流沿着有向边推动棋子,不能走的玩家判负。
SG 函数:SG(x)=mex{SG(y1),SG(y2),⋯,SG(yn)},其中 {yi} 是 x 的后继。约定终止态的 SG 值为 0。当且仅当 SG 和为 0 时,该状态为必败态;否则该状态为必胜态。
Nim-k 游戏与 Nim-k 定理
Nim-k 游戏:n 堆物品,每堆有 ai 个,两个玩家轮流取走任意 1∼k 堆的任意个物品,不能不取。没有物品取的玩家判负。
Nim-k 定理:设第 i 堆石子个数为 ai,把所有 ai 用二进制表示后,以每 k+1 位为一段,像 k+1 进制数一样,做不进位加法。当且仅当结果为 0 时,该状态为必败态;否则该状态为必胜态。
Nim 积
设 k 为最小的正整数满足 x<22k。下面 P=22k−1。
费马数的性质:22k⊗x=22k⋅x,x⊗y<22k,P⊗P=23P=P⊕2P。
xy=(aP+b)(cP+d)=acP2+(ad+bc)P+bd=ac2P+acP+((a+b)(c+d)+ac+bd)P+bd=ac2P+((a+b)(c+d)+bd)P+bd
分治递归即可。时间复杂度 O(logxlogy)。