簡體   English   中英

具有O(n)內存而不是O(n log n)的Karatsuba算法

[英]Karatsuba algorithm with O(n) memory instead of O(n log n)

已知時間復雜度為〜O ~O(n^log2(3))的遞歸Karatsuba乘法算法比復雜度為O(n^2)的簡單乘法算法要快。
但是,它比“學年級”算法使用更多的內存空間O(n log(n))而不是O(n)內存,這對於具有少量內存的控制器或非常小的計算機來說確實很關鍵。

所以,我的問題是:
有沒有辦法在karatsuba算法中實現O(n)存儲空間?

PS:我知道使用FFT可以達到更快的速度O(n log(n))和更好的內存使用率O(n) ,但是我只是對唐津(Karatsuba O(n)很好奇。

Karatsuba的算法僅需要O(n)空間。

(A0 2^n + B0)(A1 2^n + B1)
= A0 A1 2^(2n) + B0 B1 + ((A0+B0)(A1+B1) - A0 A1 - B0 B1)2^n

這是一個粗略的歸納論證。 歸納地,假設使用Karatsuba算法將n位數字相乘僅占用cn空間。 要乘以2n位數字,我們可以在cn空間中乘以A0 A1,然后將答案保存在2n空間中 ,然后在cn空間中乘以B0 B1,然后將答案保存在2n空間中,然后乘以(A0 + B0)(A1 + B1)在cn空間中。 此時,我們最多使用(c + 4)n個空間。 然后我們執行減法,並將答案記錄在4n空間中。 峰值空間使用量為(c + 4)n,小於max(c,4)(2n)空間。 因此,只要c> 4,如果將cn個空格乘以n個數字,則需要c(2n)空格乘以2n個數字。 這是不精確的,因為(A0 + B0)和(A1 + B1)可能有n + 1個數字而不是n。 因此,嚴格的歸納論證會比較混亂,但是可以遵循相同的基本模式來完成。

問題的前提是錯誤的。 Karatsuba乘法僅需要O(n)空間,而不需要Omega(n log n)。 某些實現可能需要更多的空間,而不必局限於O(n log n),例如,如果您並行執行計算。

實際上,有可能在答案之外的O(log n)額外位中進行Karatsuba乘法。

答案是肯定的:

使用輸入數組的N個條目和輸出數組的2 * N個條目,可以就地執行“ Karatsuba”算法,從而節省每次遞歸的額外內存。

看看這里的例子: https : //github.com/hselasky/libmbin/blob/master/mbin_multiply_x3.c

--HPS

暫無
暫無

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

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