一個數的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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章