求a的n次方一般的最簡單的方式就是從頭乘到尾,但是這樣子時間時間複雜度較高
// 從頭乘到尾 o(n)
private
static
long
pow0
(int a,
int n)
return res;
}
那我們應該如何優化呢?
方法一:
首先,我們是否可以使用二分法的思想,a的n次方等於a的n/2此方乘上a的n/2次方
然後,我們可以使用位移操作來加快**執行速度,先設定乙個引數ex,代表n從1到n/2的變化,
,再設定res為單前的結果,我們以自底向上的方式去執行**,時間複雜度為logn
//logn
private
static
long
pow(
int a,
int n)
long res = a;
//單前結果
int ex =1;
//當前指數大小
while
((ex<<1)
<=n)
return res*
pow(a, n-ex)
;}
方法二:我們使用了自底向上,那麼我們也可以使用自頂向上的方法,我們可以判斷n是偶數還是奇數,如果是偶數則等於其 (a,n) = (a,n/2) * (a,n/2) ,如果是奇數,則 (a,n) = (a,n/2) * (a,(a/2)+1), 這樣子父問題就分解為子問題,使用遞迴求解
private
static
long
pow3
(int a,
int n)
if(n%2==
0)else
}
上面是不是可以再優化?
我們是不是可以把一些資料暫時存起開使用
private
static
long
pow2
(int a,
int n)
if(n%2==
0)arr[n]
=pow2
(a,n>>1)
*pow2
(a,n>>1)
;//將資料暫時存起來
return arr[n];}
else
arr[n]
=pow2
(a,n>>1)
*pow2
(a,(n>>1)
+1);
//將資料暫時存起來
return arr[n];}
}
**執行時間對比如下: 求x的n次方結果,時間優化
if n 0 判斷負指數 flag 1 else flag 0 n abs n 全設為正 i 2 從list 2 開始計算 exp 1 前乙個陣列的指數狀態 if len list n 1 若已經計算過,則返回 if flag return 1 list n return list n while ...
求a的n次方
此題面試時常有 解答方法有以下三種 1。直接迭代求解,這個很簡單,複雜度o n 1。分治法。複雜度 logn a a n 2 a an 1 如下 intpower inta intn 3.此方法複雜度為 n的二進位制表示中最高位1的index 原理為 事先建立a的 2m m為 0,x 的表。指導找到...
計算x的n次方
計算x的n次方有遞迴和遞推程式。不論從時間或空間來看,自然遞推優於遞迴。然而,二分法則是極其優的一種方法,用在計算x的n次方完全沒有問題,而且不是遞迴而是遞推的程式。程式中使用條件編譯,以便於統計分析演算法的計算量。正解是函式power3。計算x的n次方程式 1.遞迴程式 2.非遞迴程式 3.二分法...