o(logn)的時間複雜度求x的n次方,x為自然數,n為整數?
如果 power=5 為奇數,result儲存當前的多餘的乙個4,並在返回結果時一併與結果相乘。
2^10 = (2*2) * (2*2) * (2*2) * (2*2) * (2*2)= 4 ^5 = 4^4 * 4
4^4 = (4*4) * (4*4) = 16 ^ 2
16^2 = 16 * 16 = 256
如果 power=1 時,結果返回base=256
256^1 = 256
求x^y?
y使用二進位制數表示:
y = 2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^yn
x^y = x^(2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^yn)
= x^(2^y0) * x^(2^y1) * x^(2^y2) * x^(2^y3) * ... * x^(2^yn-1) * x^(2^yn)
證明:x^(2^yn) = (x^(2^yn-1))^(2^yn-1), yn = 2 * yn-1 ?
x^(2^yn) = x^(2^(2 *yn-1))
= x^(2^yn-1 * 2^yn-1)
= (x^(2^yn-1))^(2^yn-1)
int fast_pow(int
base, int power)
int fast_pow2(int
base, int power)
return result * value;
}
f(n)函式為fast_power演算法的執行的基本操作的執行次數
f(1) = 0
f(n) = f(n/2)+1
= f(n/2^2) + 1 + 1
... = f(n/2^k) + k
當n/2^k = 1,k=logn,f(n) = logn
則fast_power演算法的時間複雜度為o(logn)
空間複雜度為o(1)
fast power algorithm: c/c++ and python code
快速冪 exponentiation by squaring | 黃鈺程
fast power
快速冪非遞迴實現(即求x的n次方)
如果用遞迴的方法求冪,可以是這樣的 double pow double x,unsigned int n 注意 n若為乙個奇數,那麼它對應的二進位制最後一位一定是1,與上1最終一定是1 上面的n為非負,如果要求負數次冪,可以先求正數次冪再用1除之 上述方法雖然簡單,但是效率並不高.因為函式呼叫的代價...
求x的N次冪
典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...
快速冪(求a的b次方 求餘運算)
求a的b次方 public static intquickpower int a,int b base base base自乘,由a 2 n 變成a 2 n 1 b 1 位運算,b右移一位,如1010變成101 把最右邊的1移掉了 除以2 1 return ans 取餘運算 取餘運算有一些好用的性質...