###实现二分求幂

题目:

Pow(x, n)

Implement pow(x, n).

简单粗暴的只用实现求幂函数pow(x,n)

其实网上有一篇挺好的文章:

[http://blog.jobbole.com/74468/]

英文版:

[http://videlalvaro.github.io/2014/03/the-power-algorithm.html]

A过的代码如下:


def myPow(self, x, n):
		y=1
		if n < 0:
			index = -n
		else:
			index = n
		while (1):
			ret = index % 2 
			if ret == 1:
				y *= x
			index /= 2
			if index==0:
				break;
			x *= x
		if n < 0:
			return 1/y
		else:
			return y

刚刚躺床上玩了半个小时手机归来.

试图自己阐述一遍思路:

原理是这样的. 比如2的6次方, 相当于3个2的2次方相乘, 或者是一个2的4次方乘以2的平方.

所以就可以以平方 为单位把求幂的过程分解

假设求x的y次方, 用index 表示 y/2 之后的整数部分的值 用mod 表示y/2 的余数

那么一开始的算式是:

result = x^y

提取一个平方

result = x^2*(x^(y/2)*x^mod) = x^2*x^(y/2)*(x^2)*x^mod

再次提取一个平方

result = x^2*x^2*(x^(y/(2*2))*x^mod)*(x^2)*x^mod
       = (x^2)^2*x^(y/(2^2))*(x^2)^2*x^mod*x^2*x^mod

这里面就有递归迭代的意思了 , 所以呢. 无节操引用个别人的用递归实现的方法

 class Solution 
 {
    public:
    double pow(double x, int n) 
    {
        int index = n;
        if (n == 0)
            return 1;
        if (n == 1)
            return x;
        if (n < 0)
            index = -n;
        double rev = index%2==0 ? pow(x*x, index>>1) : pow(x*x, index>>1)*x;
        if (n < 0)
            return 1 / rev;
        else
            return rev;
    }
 };

另外既然是二分查找, 就可以看到二进制数和二分查找的相关性,

其实这个查找过程就和求二进制数是一样的

不断的除以二然后记录余数…直到商为0

所以可以用遍历幂的二进制形式的方法来解答, 继续盗代码

[http://blog.csdn.net/fengbingyang/article/details/12236121]

double my_pow(double x, int n)
{
	if(n==0)
        	return 1.0;
	if(n<0)
		return 1.0 / pow(x,-n);
	double ans = 1.0 ;
	for(; n>0; x *= x, n>>=1)
	{
		if(n&1>0)
			ans *= x;
	}
	return ans;
}

恩关于应用呢.

在第一篇引用的文章里面有写, 可以做方便的repeat函数用, 因为求幂运算就是不断重复一个


def function_foo(a,b):
	return a*b

的运算, 只不过传进去的是 function_foo(x,x)

所以这样的算法可以降低所有repeat函数的时间复杂度到O(log(n))