个人主页:丷从心·
系列专栏:分治算法
学习指南:算法学习指南
问题描述
- 设 X X X和 Y Y Y都是 n n n位二进制整数,计算它们的乘积 X Y XY XY
基础算法
- 将
n
n
n位二进制整数
X
X
X和
Y
Y
Y都分为
2
2
2段,每段的长为
n
/
2
n / 2
n/2位(假设
n
n
n是
2
2
2的幂)
- X = A × 2 n / 2 + B X = A \times 2^{n / 2} + B X=A×2n/2+B
- Y = C × 2 n / 2 + D Y = C \times 2^{n / 2} + D Y=C×2n/2+D
X Y = ( A × 2 n / 2 + B ) ( C × 2 n / 2 + D ) = A C × 2 n + ( A D + B C ) × 2 n / 2 + B D XY = (A \times 2^{n / 2} + B)(C \times 2^{n / 2} + D) = AC \times 2^{n} + (AD + BC) \times 2^{n / 2} + BD XY=(A×2n/2+B)(C×2n/2+D)=AC×2n+(AD+BC)×2n/2+BD
时间复杂性
- 如果按此式计算 X Y XY XY,必须进行 4 4 4次 n / 2 n / 2 n/2位整数的乘法, 3 3 3次不超过 2 n 2n 2n位的整数加法,以及 2 2 2次移位,所有这些加法和移位共用 O ( n ) O(n) O(n)步运算
T ( n ) = { O ( 1 ) n = 1 4 T ( n / 2 ) + O ( n ) n > 1 T(n) = \begin{cases} O(1) & n = 1 \\ 4 T(n / 2) + O(n) & n > 1 \end{cases} T(n)={O(1)4T(n/2)+O(n)n=1n>1
T ( n ) = O ( n 2 ) T(n) = O(n^{2}) T(n)=O(n2)
优化算法
- 要想改进算法的计算复杂性,必须减少乘法次数,把 X Y XY XY写成另一种形式
X Y = A C × 2 n + ( ( A − B ) ( D − C ) + A C + B D ) × 2 n / 2 + B D XY = AC \times 2^{n} + ((A - B)(D - C) + AC + BD) \times 2^{n / 2} + BD XY=AC×2n+((A−B)(D−C)+AC+BD)×2n/2+BD
时间复杂性
- 需做 3 3 3次 n / 2 n / 2 n/2位整数的乘法, 6 6 6次加减法和 2 2 2次移位
T ( n ) = { O ( 1 ) n = 1 3 T ( n / 2 ) + O ( n ) n > 1 T(n) = \begin{cases} O(1) & n = 1 \\ 3 T(n / 2) + O(n) & n > 1 \end{cases} T(n)={O(1)3T(n/2)+O(n)n=1n>1
T ( n ) = O ( n log 3 ) = O ( n 1.59 ) T(n) = O(n^{\log{3}}) = O(n^{1.59}) T(n)=O(nlog3)=O(n1.59)