整数相乘

来源:互联网 发布:淘宝独立设计师店铺 编辑:程序博客网 时间:2024/06/10 01:57

分析

  1. 直接进行二进制计算,复杂度为O(n2)
  2. 采用如下的方法:
    xy={2(xy/2),x+2(xy/2),if y is evenif y is odd

递推思路

上面的公式我们也可以变形为2xy/2,这样递推下去,当y等于1时,就可以得出最终的结果。这里是一种递推的思路。举例分析如下:

11521132652104

如果当前除以2的这个数是奇数,那么就代表有一个单位没有被包含在下一次的计算中,所以最终计算的时候需要加上,如上面公式所示,所以这里的结果是13+26+104 = 143。

递归思路

就如上面公式一样,进行递归处理,举例如下:
假如上面的x=13,y=11,结合上面的例子分析。从最底层的递归进行推导:

x y z 13 1 13 13 2 26 13 5 13+52 13 11 130+13

代码如下:

int multiply(int x, int y){    if (y == 0) return 0;    int z = multiply(x, y / 2);    if (y % 2 == 0) return 2 * z;    else return x + 2*z;}

总结

通过上面的分析我们可以发现将公式稍微变形;就可以得出递推和递归两种形式的方法,其本质的区别在于一个需要分解后然后回溯。另一个却是一步一步逼近最终答案。分析发现其实我们的复杂度并没有下降。(进一步补充乘法的最佳复杂度)

原创粉丝点击