问题
设X
和Y
都是n位二进制整数
,现在要计算它们的乘积XY
。
提供三种方法计算XY
方法一
模拟我们日常所做的竖式乘法
![1](https://i-blog.csdnimg.cn/blog_migrate/8ac251c3b23a1feed69602567b080823.png)
可以很明显的看出来这种模拟竖式乘法的时间复杂度为O(n2)
方法二
我们采用分治的思想,将 n 位二进制整数的 X 和 Y 都分成2段,每段的长为n/2
由此可以得到
- X = A2n/2 + B
- Y = C2n/2 + D
- XY = ( A2n/2 + B )( C2n/2 + D ) = AC2n + (AD + BC)2n/2 + BD
这样就把规模为n的原问题,转换成了4个规模为n/2的子问题,在这个问题中进行4次n/2位整数的乘法,3次不超过2n位的整数加法,以及两次移位(分别对应式子中乘2n和乘2n/2)
因此设T(n)是2个n位整数相乘所需的运算总数,则有
![3](https://i-blog.csdnimg.cn/blog_migrate/1f7e6a4082b080077faf80aaf9366b0a.png)
可解得算法时间复杂度T(n) = O(n2),可以看到这种算法并没有将时间复杂度降低,并不比竖式乘法更有效
方法三
这里我们考虑降低分治算法中子问题的个数,从而降低算法的时间复杂度
原来的子问题中需要计算(AC、AD、BC、BD)这4个子问题的解
下面将XY写成另一种形式
- XY = AC2n + ((A - B)(D - C) + AC + BD)2n/2 + BD
在这种形式中,子问题的个数减少到了3个(AC、BD、(A - B)(D - C))
这时的T(n)表达式为
![4](https://i-blog.csdnimg.cn/blog_migrate/a3e48c2d0ffaf6a4dbf3734cc5eb5464.png)
由此得出的时间复杂度为T(n) = O(n1.59)