簡體   English   中英

如何在恆定時間內僅使用算術運算來計算指數?

[英]How to calculate exponent using only arithmetic operations in constant time?

我試圖找到一種方法來遍歷大小為 N 的整數數組,並將這些整數中的每一個乘以 128^((N-1) - i),其中 N 是數組的長度,i 是索引的整數,然后將所有這些結果加在一起。

例如,[1, 2, 3, 4] 的數組輸入將返回 1 * (128^3) + 2 * (128^2) + 3 * (128^1) + 4 * (128^0)。

我的算法需要在 O(N) 時間內運行,但指數運算很昂貴,例如,2^3 需要三個運算。 所以,我需要找到一種方法來在 O(1) 時間內對數組中的每個整數進行運算,只使用算術運算(-、+、*、/、%)。 我能想到的最明顯(不正確)的方法是簡單地將每個整數 (Ni) 相乘,但這不需要常數時間。 我也在考慮通過平方使用取冪,但這需要 log_2(Ni) 時間來操作每個整數,這不是常數。

128 是 2^7,將一個數乘以 128^k 會將其二進制表示向左移動 7*k 個位置。

1 * (128^3) + 2 * (128^2) + 3 * (128^1) + 4 * (128^0)
= 1000000000000000000000 + 1000000000000000 + 110000000 + 100 

回答標題問題:可以證明,使用恆定數量的這些操作,您不能使數字足夠大以獲取足夠大的指數。

要回答潛在的問題:您可以使用有時歸因於霍納的多項式評估方法: ((1 * 128 + 2) * 128 + 3) * 128 + 4 請注意,除非您正在修改某些東西,否則操作 bignums 仍然會花費您 Õ(n 2 ) 時間。

如果您確實在使用 bignum,那么假設 bignum 乘法比學校方法運行得更快,則有一種更復雜的分治法應該會更快。 這個想法是將輸入分成兩半,使用遞歸分別評估下半部分和上半部分,然后將它們放在一起。 在你的例子中,這看起來像

(1 * 128 + 2) * 128^2 + (3 * 128 + 4),

我們通過重復平方計算術語128^2 (即128^(n/2) )。 操作次數仍然是 O(n) 因為我們有重復

T(n) = 2 T(n/2) + O(log n),

這屬於案例 1 在實踐中,運行時間將由大乘法主導,無論特定實現具有何種漸近復雜度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM