背景介紹
設x和y都是n位二進位制整數,現在需要計算它們的乘積xy,如果使用小學的思路設計演算法,那麼需要n2次乘法和n-1次加法,效率太低,那麼能夠設計出一種演算法能夠提高效率?
方案一將n位二進位制整數x和y都分為兩段,每段的長度為n/2,如下圖所示
此時,x=a
2n/2
+bx=a2^+b
x=a2n/
2+b,y=c
2n/2
+dy=c2^+d
y=c2n/
2+d,xy的乘積就為:
x y=
(a2n
/2+b
)(c2
n/2+
d)=a
c2n+
(ad+
bc)2
n/2+
bdxy=(a2^+b)(c2^+d)=ac2^n+(ad+bc)2^+bd
xy=(a2
n/2+
b)(c
2n/2
+d)=
ac2n
+(ad
+bc)
2n/2
+bd,共需要4次2n/2位的乘法,3次長度不超過2n的加法,以及兩次移位操作,所以可以得出對應遞迴方程如下:
t (n
)=o(1)\quad\quad\quad\quad\quad\quad\quad\\ 4t(n/2)+o(n)\quad\quad \end
t(n)
=)^+c_ko(n)\\ =(2^)^+c_ko(n)\\ =o(n^)+c_ko(n)\\ =o(n^)\\ =o(n^2)
t(n)=4
kt(n
/2k)
+ck
o(n)
=4kt
(1)+
cko
(n)=
(2lo
g24
)log
2n+
cko
(n)=
(2lo
g2n
)log
24+
cko
(n)=
o(nl
og2
4)+c
ko(
n)=o
(nlo
g24
)=o(
n2)注:這裡係數是4,求完相應對數後,結果為2,寫的麻煩是為了當係數為3時,同學們也能理解清楚計算的過程。
方案二x y=
ac2n
+((a
−b)(
d−c)
+ac+
bd)2
n/2+
bdxy=ac2^n+((a-b)(d-c)+ac+bd)2^+bd
xy=ac2
n+((
a−b)
(d−c
)+ac
+bd)
2n/2
+bd,看上去算式更複雜,但僅需3次n/2位整數的乘法,6次加、減法和2次移位。於是可得出遞迴方程如下:
t (n
)=o(1)\quad\quad\quad\quad\quad\quad\quad\\ 3t(n/2)+o(n)\quad\quad \end
t(n)
=)=o(n^)
t(n)=o
(nlo
g23
)=o(
n1.5
9),相較於之前的,算是較大的乙個改進。
大整數乘法 分治演算法的時間複雜度
1.1原始的低效演算法 我們將n位 為方便討論簡化問題,我們假設n是2的冪 十進位制整數 二進位制也可以 x y都分為2段,每段的長度是n 2位。如果現在直接用遞迴或分治進行程式設計,其演算法複雜度為 其中 t n 代表規模為n的問題,係數4表示問題縮小到t n 2 時,包含四次乘法 上式中ac a...
矩陣乘法複雜度分析
在很多機器學習或者資料探勘 中,裡面或多或少的涉及到演算法複雜度分析。進一步思考,是如何得到的呢?很長時間裡,我也感受到比較疑惑,閱讀 過程中,在涉及到這部分內容時,會直接跳過演算法複雜度分析這快。其一是因為比較燒腦。雖然知道複雜度分析是對演算法總體上的概況,用來進行演算法間好壞的比較 由此可見,重...
遞迴演算法時間複雜度分析
一般情況下,演算法中基本操作重複的次數就是問題規模n的某個函式f n 進而分析f n 隨n的變化情況並確定t n 的數量級。這裡用 o 來表示數量級,給出演算法時間複雜度。t n o f n 它表示隨問題規模n的增大,演算法的執行時間增長率和f n 增長率成正比,這稱作演算法的漸進時間複雜度。而我們...