一个数的N次幂

问题:求解X^Y,XY都为整数,且Y非负。要求时间复杂度小于O(N)

常规算法O(N)

for循环从0到Y-1每次都累乘X得到结果,复杂度显然为n

归并

将X^Y问题进行划分,等价于:

  1. Y为偶数时 X^(Y/2) * X^(Y/2) 即 (X^(Y/2))平方
  2. Y为奇数时(X^(Y/2))平方*X
int nth_power2(int x, int y){
	if (!x)
		return 0;
	if (!y)
		return 1;
	if (1 == y)
		return x;
	int ret = nth_power(x,y/2);
	return y % 2 ? ret*ret*x : ret*ret;
}

时间复杂度:
T(n) = T(n/2)+O(1)用master公式(主公式)可得出 时间复杂度为logn

在这里插入图片描述
log(b,a)表示以b为底数,a为对数 例 log(2,1) = 0;
注意:上面的问题我们用的是ret*ret来解决的,如果直接用
nth_power(x,y/2) * nth_power(x,y/2) 时间复杂对会变为n因为这样每次都会调用两次 nth_power函数。

迭代

对于X的Y次方可以进行以下拆解 以3^11为例
11 对应二进制 1011 那么
3^ 11 = 3 ^ 8 * 3 ^ 2 * 3 ^1
怎么得来的1011 一共四位 ,每一位对应的数为8 0 2 1
即1011 = 1000 + 000 +010 +001分别对应 8 0 2 1
怎么用?
可以发现这些数都是2的n次方,以平方的形式进行累成 ,就可以把时间复杂度为n的问题化解为logn的问题了,以本题为例原先需要11次现在只需要4次

int nth_power(int num, int n){
	if (!num)
		return 0;
	if (!n)
		return 1;
	int ret = 1;
	while (n){
	//最后一位如果是1 则把结果累乘进去
		 n & 1 ?ret*= num : ret*=1;
		 num *= num;
		 n >>= 1;
	}
	return ret;
} 
发布了145 篇原创文章 · 获赞 12 · 访问量 9640

猜你喜欢

转载自blog.csdn.net/weixin_44997886/article/details/105043454