分治策略
最简单的分治算法应用
1.计算阶乘
public static int factorial(int n) {
assert(n >= 0);// pre-condition
if (n == 0) return 1;
else return n * factorial(n-1);
// post-condition: returns n!
}
二分搜索
需要O(log n)次比较,花费对数时间复杂度O(log n),花费常数O(1)空间。
快速排序
排序n个元素平均需要O(nlog n)次比较,最坏情况需要O(n2n2)次比较,可以在数组就地操作,使用较少的额外空间/内存。
不是一个稳定排序,相等元素的相关顺序没被保留。
合并排序
排序n个元素需要花费O(nlog n)时间,使用O(n)额外空间。
是一个稳定排序,在排序输出中相等元素的输入顺序被保留。
最近点对问题
在固定维度的欧几里德空间或LpLp空间,这个问题可以在O(nlog n)时间被解决。
Strassen算法
算法使用O(n2.8974n2.8974)时间实现矩阵相乘。
Cooley–Tukey FFT算法
最常见的FFT(快速傅里叶转换)算法,花费O(nlog n)时间。
Karatsuba算法
总体上,两个n位数相乘最多需要nlog23nlog23次单数位相乘(尤其在n为2的幂时就等于nlog23nlog23)。