想知道爲什麼Karatsuba乘法的基本情況(這裏顯示:http://www.sanfoundry.com/java-program-karatsuba-multiplication-algorithm/)被選爲「N < = 10」?我發現「N < = 4,3,2,1」不會給我一個正確的結果。任何人都能解釋?Karatsuba乘法的基本情況
1
A
回答
1
Karatsuba的算法可以正確處理任何「足夠大」的基本情況,其中「足夠大」的意思是「足夠大,當它被分成更小的子問題時,那些子問題確實更小並且產生正確答案。從這個意義上說,Karatsuba並不存在「基礎」案例,而是基本案例的基本案例。
老實說,你鏈接的代碼似乎並不像它是一個非常合理的算法實現。它與long
s一起工作,在任何合理的系統上它已經可以在O(1)時間內相乘,並且它們的基本情況是當數字小於10時停止,這意味着對於64位數的遞歸總是在一步之後終止。更好的實現可能會使用類似BigInteger
類型的類型,它可以支持任意精度乘法。此時,選擇最佳基本情況是性能調整的問題。使基本情況下的數字數量太小,處理較小數字的遞歸將花費更多的時間,而不僅僅是做一個天真的乘法。讓基數過高,你會開始看到放緩,因爲遞歸步驟更好地處理了情況,而不是使用簡單乘法的花費。
1
具有小於10位數的數字可以原生地相乘(x*y
),因爲結果總是適合於有符號的64位整數。
雖然使用long
數據類型沒有多大意義,因爲大多數不會溢出的數字組合只會在本機進行評估。您必須更改爲BitInteger
或類似的東西,並使用更大的數字從算法中獲得任何收益。
至於爲什麼它沒有達到N
的下限,我不確定。該算法必須能夠將兩個數字分成兩個相似大小的部分。我想在某些情況下,它會以零或負數結束。
1
如果你在你的文章中包含了源代碼,你很可能會很快得到一個點對點的答案。
如果你使用類似BigInteger.divideAndRemainder(dividend, divisor)
到「拆分」你的號碼,你就不會跑的風險,像
long d = y/m;
long c = y - (d * N);
(使用除數不同的乘數)代碼的東西。
請注意,兩個10
數字的乘積並不總是適合於Java的long
。
相關問題
- 1. Karatsuba乘法器
- 2. Karatsuba乘法改進
- 3. karatsuba乘法,遞歸問題
- 4. Java中的Karatsuba乘法實現BigDecimal
- 5. Python中的Karatsuba乘法:執行時間
- 6. 關於karatsuba乘法的問題
- 7. 在JavaScript中實現Karatsuba乘法?
- 8. 字節數組Karatsuba乘法優化
- 9. 邏輯基本情況
- 10. 獲取karatsuba乘錯了地方
- 11. 基本的畫布使用情況android
- 12. 基本的DFS空間使用情況
- 13. 交易情況的基本模式
- 14. 矩陣乘法最壞的情況下,最好的情況下和平均情況下的複雜性
- 15. Karatsuba整數乘法失敗和分段錯誤
- 16. karatsuba算法在Python
- 17. karatsuba算法錯誤
- 18. 基本的遞歸方法 - 階乘
- 19. Javascript中的Karatsuba算法
- 20. 我怎麼能寫這個算法的基本情況?
- 21. 遞歸算法中的基本情況和時間複雜度
- 22. 基本航點使用情況
- 23. 列表遞歸基本情況
- 24. 故障基本情況哈斯克爾
- 25. 問題遞歸不打基本情況
- 26. 基本乘用PHP
- 27. 我該如何處理這個遞歸函數的基本情況?我的基本情況是造成零
- 28. R乘積基於值的乘法
- 29. Karatsuba算法太多遞歸
- 30. 分而治之矩陣乘法基本情況+如何矩陣分成4個季度
@greybeard固定 –