宏观上,我们认为数的相乘为constant time,即O(1). 然而,如果考虑到数的位数,那么乘法操作就变得复杂起来。
如果两个长度为N的数相乘,小学所讲的乘法运算复杂度为O(n^2) –> 对每一位都要进行相乘运算。
另一个方法是karatsuba。
如图所示,基础思想为divide and conquer。
以下为c++代码。
1 | int get_length(long num) { |
在写代码的时候,发现使用long并不会扩张int的取值范围。于是去百度,发现,long的位数由编译器来确定,c语言只规定long位数不低于int。
而我使用的VC,把long定义为4字节,同int一样。
快速幂:
求幂的时候,我们也可以用divide and conquer来缩短运算。如果把相乘看为O(1),求N次幂显然需要O(N)次运算。
然而,我们可以让底数增大,这样相乘的次数就会减少。例如$2^4 = 2^2 * 2^2$.
于是,运算可以简化为O(logN)
以下是相应代码。
1 | double Power(double base, int exponent) { |