递归方程+复杂度分析
大整数的乘法
背景介绍
设X和Y都是n位二进制整数,现在需要计算它们的乘积XY,如果使用小学的思路设计算法,那么需要n2次乘法和n-1次加法,效率太低,那么能够设计出一种算法能够提高效率?
方案一
将n位二进制整数X和Y都分为两段,每段的长度为n/2,如下图所示
此时, X = A 2 n / 2 + B X=A2^{n/2}+B X=A2n/2+B, Y = C 2 n / 2 + D Y=C2^{n/2}+D Y=C2n/2+D,XY的乘积就为:
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=(A2^{n/2}+B)(C2^{n/2}+D)=AC2^n+(AD+BC)2^{n/2}+BD
XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+BC)2n/2+BD,共需要4次2n/2位的乘法,3次长度不超过2n的加法,以及两次移位操作,所以可以得出对应递归方程如下:
T
(
n
)
=
{
O
(
1
)
n
=
1
4
T
(
n
/
2
)
+
O
(
n
)
n
>
1
T(n)= \begin{cases} O(1)\quad\quad\quad\quad\quad\quad\quad{n=1}\\ 4T(n/2)+O(n)\quad\quad{n\gt1} \end{cases}
T(n)={O(1)n=14T(n/2)+O(n)n>1
对应的时间复杂度求解过程如下:
当n>1时(注:ci为常数):
T
(
n
)
=
4
T
(
n
/
2
)
+
O
(
n
)
=
4
2
T
(
n
/
2
2
)
+
c
1
O
(
n
)
=
.
.
.
=
4
k
T
(
n
/
2
k
)
+
c
k
O
(
n
)
T(n)=4T(n/2)+O(n)\\ =4^2T(n/2^2)+c_1O(n)\\ =...\\ =4^kT(n/2^k)+c_kO(n)
T(n)=4T(n/2)+O(n)=42T(n/22)+c1O(n)=...=4kT(n/2k)+ckO(n)
令
2
k
=
n
2^k=n
2k=n,则
k
=
l
o
g
2
n
k=log_2n
k=log2n,此时
T
(
n
)
=
4
k
T
(
n
/
2
k
)
+
c
k
O
(
n
)
=
4
k
T
(
1
)
+
c
k
O
(
n
)
=
(
2
l
o
g
2
4
)
l
o
g
2
n
+
c
k
O
(
n
)
=
(
2
l
o
g
2
n
)
l
o
g
2
4
+
c
k
O
(
n
)
=
O
(
n
l
o
g
2
4
)
+
c
k
O
(
n
)
=
O
(
n
l
o
g
2
4
)
=
O
(
n
2
)
T(n)=4^kT(n/2^k)+c_kO(n)\\ =4^kT(1)+c_kO(n)\\ =(2^{log_24})^{log_2n}+c_kO(n)\\ =(2^{log_2n})^{log_24}+c_kO(n)\\ =O(n^{log_24})+c_kO(n)\\ =O(n^{log_24})\\ =O(n^2)
T(n)=4kT(n/2k)+ckO(n)=4kT(1)+ckO(n)=(2log24)log2n+ckO(n)=(2log2n)log24+ckO(n)=O(nlog24)+ckO(n)=O(nlog24)=O(n2)
注:这里系数是4,求完相应对数后,结果为2,写的麻烦是为了当系数为3时,同学们也能理解清楚计算的过程。
方案二
X
Y
=
A
C
2
n
+
(
(
A
−
B
)
(
D
−
C
)
+
A
C
+
B
D
)
2
n
/
2
+
B
D
XY=AC2^n+((A-B)(D-C)+AC+BD)2^{n/2}+BD
XY=AC2n+((A−B)(D−C)+AC+BD)2n/2+BD,看上去算式更复杂,但仅需3次n/2位整数的乘法,6次加、减法和2次移位。于是可得出递归方程如下:
T
(
n
)
=
{
O
(
1
)
n
=
1
3
T
(
n
/
2
)
+
O
(
n
)
n
>
1
T(n)= \begin{cases} O(1)\quad\quad\quad\quad\quad\quad\quad{n=1}\\ 3T(n/2)+O(n)\quad\quad{n\gt1} \end{cases}
T(n)={O(1)n=13T(n/2)+O(n)n>1
通过上述的时间复杂度求解过程,可算得
T
(
n
)
=
O
(
n
l
o
g
2
3
)
=
O
(
n
1.59
)
T(n)=O(n^{log_23})=O(n^{1.59})
T(n)=O(nlog23)=O(n1.59),相较于之前的,算是较大的一个改进。
因为博主写也只是在学习过程中做个人总结,所以难免可能会有错误的地方,欢迎大家一起交流、讨论。如果有幸解决了您的一些疑问,本人不胜感激!