关于快速幂瞎BB

       说来快速幂这个东西发现的时候真的惊艳到我了,突然觉得之前自己很呆萌的计算方式完全就是浪费了自己的电脑,看了看网上大佬们的一些关于快速幂的讲解和举例,深深感到自己的学识不够。

       首先说一下原理吧,我们都知道如果我们要计算a的n次方的话,一般情况下你的时间复杂度为O(n),因为你会从第一个开始乘一直乘到n个,这样计算的结果肯定正确,因为是按照了定义进行运算,不过很多情况下如果大家去刷题之类的还是容易爆出来TLE(时间超限),这种情况下,很多呆萌的同学就会觉得自己的就算已经够简单了啊,怎么还是报超时,但是实际上,有可能你最后一块可以优化的地方就在你计算幂的函数上。

       我们都知道,一个十进制数字可以转化为二进制数字来计算,这里举例a的21次方。

       那么这里我们看21,转化为二进制就是10101,那么就按二进制运算来看,这个数字是不是可以拆分成为:10000+100+1呢?

       也就是说,再次变回十进制之后,a的21次方已经变成了a的16+4+1次方,我们只需要计算这三个次方相加的和就行了。

       有聪明的同学可能已经想到了解法,没错,如果我们写这么一个循环,以次方也就是n的二进制位数作为循环次数,只需要计算出来每次遇到1的时候的幂的和就行了!没错就是这么算的~

       比如下面这个

int fast_pow(int a, int n)
{
	int ans = 1, base = a;
	while (n != 0)
	{
		if (n % 2) ans *= base;
		base *= base;
		n /= 2;
	}
	return ans;
}

       很容易看出来,每次当n的二进制末尾也就是取余2的结果为1的时候就让结果再乘以base,不管什么时候都让base一直计算自己的平方,这么就做到了每次去计算幂的时候直接乘以base就可以了,算法的时间复杂度直接降到了O(log n),怎么样?是不是特别快?

猜你喜欢

转载自blog.csdn.net/Elliot_Alderson/article/details/81204899
bb
今日推荐