![](/img/trans.png)
[英]What is the running time of the algorithm? is it O(sqrt(n)) or O(log(n))?
[英]exponential multiplication algorithm that runs in O(n) time?
我正在讀一本算法教科書,我對這個問題很難過:
假設我們想要計算值x ^ y,其中x和y分別是具有m和n位的正整數。 解決問題的一種方法是用x進行y-1次乘法。 你能提供一個只使用O(n)乘法步驟的更有效的算法嗎?
這會是一個分而治之的算法嗎? y-1乘以x將在θ(n)右邊運行? ..我不知道從哪里開始這個問題
我以迭代的方式更好地理解這一點:
你可以計算所有2的冪的x ^ z:z =(2 ^ 0,2 ^ 1,2 ^ 2,...,2 ^(n-1))
簡單地從1到n並且應用x ^(2 ^(i + 1))= x ^(2 ^ i)* x ^(2 ^ i)。
現在您可以使用這些n值來計算x ^ y:
result = 1
for i=0 to n-1:
if the i'th bit in y is on:
result *= x^(2^i)
return result
一切都在O(n)完成
應用簡單的遞歸進行分而治之。 在這里,我發布更像偽代碼。
x^y :=
base case: if y==1 return x;
if y%2==0:
then (x^2)^(y/2;
else
x.(x^2)^((y-1)/2);
y-1
乘法解決方案基於身份x^y = x * x^(y-1)
。 通過重復應用身份,您知道您將以y-1
步驟將y
減少到1
。
更好的想法是更“減少”地減少y。 假設偶數y
,我們得到x^y = x^(2*y/2) = (x^2)^(y/2)
。 假設奇數y
,我們得到x^y = x^(2*y/2+1) = x * (x^2)^(y/2)
。
如果繼續使用x^2
而不是x
進行功率計算,您會看到可以將y
減半。
遞歸:
Power(x, y)=
1 if y = 0
x if y = 1
Power(x * x, y / 2) if y even
x * Power(x * x, y / 2) if y odd
查看它的另一種方法是將y
讀作加權位的總和。 y = b0 + 2.b1 + 4.b2 + 8.b3...
取冪的性質意味着:
x^y = x^b0 . x^(2.b1) . x^(4.b2) . x^(8.b2)...
= x^b0 . (x^2)^b1 . (x^4)^b2 . (x^8)^b3...
您可以通過平方獲得所需的x冪,並且y的二進制分解告訴您要乘以哪些冪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.