java 数据结构

java快速求幂算法

2017-05-21  本文已影响75人  过期的薯条

1.引言

快速求幂算法是java算法与数据结构后面的习题。据说这个题目被当做面试考过。正好我也不懂,然后就看了下,于是来记录一下。

2.正文

在学习java的时候,一般做阶乘(阶乘数不是很高)都是按照如下的代码:

 //a是底数,b是阶数
    public double factorial (double a,int b){
        double sum=1d;
        for (int i=1;i<=b;i++){
            sum=sum*a;
        }
        return sum;
    }

这种算法明显有问题。假如阶乘是100次,那么要乘100次。时间效率底下。

我要说的这个算法的精髓是这样的:假如要求5^11的值。我们把阶数每次循环一次除以2。例如 5^11= 5 x 5^10; 510=(52)^5 ; (52)5=(54)2 x 5;依次这样分解下次得到的结果是5^8 x 5^2 x5^0 。 递归算法如下

 public double power(double a,int b){
        if (b==0)return 1;
        if (b==1)return a;
        if ((b&1)==0)return power(a*a,b>>1);
        else return a*power(a*a,b>>1);

    }

根据递归算法写一个非递归算法。

  public double power1(double a,int b){
        double result=1d;
        if (b==0)return 1;
        if (b==1)return a;
        while (b>0){
            if ((b&1)==1){
                result=result*a;
            }
            a=a*a;
            b=b>>1;
        }
        return result;
    }

根据循环进行的次数可以看出。时间复杂度为O(logn)

上一篇下一篇

猜你喜欢

热点阅读