a的n次方優化

2021-10-01 07:45:20 字數 1406 閱讀 5737

求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.二分法...