指数函数的另外一种实现

一般情况下,指数函数pow(n,m)的一种较为简单的实现为
public long myPow(int n, int m){
         long value = 1;
          while(m>0){
                value *= n;
                m--;
    }
        return value;
}

 这种算法的时间复杂度为 O(m);

在计算规模较小的情况下,这种算法较为有效,但当规模增大的一定程度时就可以使用下面这种算法

 以x21为例

1)x21= x10101  21的二进制即为10101

2)从指数的二进制左边开始,第一个为1 则表示为 y=y*y*x=x  (y初始值为1)

3)第二个为0 则 y=y*y =x2

4)第三个为1 则 y=y*y*x=x5

5)第四个为0 则 y=y*y=x10

6)第五个为1 则 y=y*y*x=x21


代码实现

/**
 *Apr 14, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author JackWang
*/
package com.myjava.generic;

public class MyPow {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int x = 2;
		int n = 12;
		long value = myPow(x,n);
		System.out.println(value);
	}
	private static long myPow(int x, int n) {
		int m; 
		m = n;
		int t = 1;
		while(m > 0){
			m /= 2;
			t *= 2;   // 1;
		}
		m = n;
		int y = 1;
		while(t>1){
			t /= 2;
			y *= y;
			while(m >= t){
				y *= x;
				m -= t;   // 2;
			}
		}
		return y;
	}

}

此算法理解起来较为复杂,但时间复杂度为 O(logm)

该算法中较难理解的事 标记为  1 ,2 两处

1处为 记录m 转换为2进制时 其bit 数 +1 的 值   2处为将最左边的1 处理之后的情况 下面的图可以 帮助理解一下

你可能感兴趣的:(数据结构和算法)