簡體   English   中英

Python中模運算符的時間復雜度

[英]Time complexity of modulo operator in Python

我正在嘗試確定我擁有的算法的時間復雜度,但我首先需要知道 Python 中 %(模)運算符的時間復雜度。

根據http://math.stackexchange.com上的這篇文章,它的時間復雜度可能類似於O(log m log n) ,並且在某些特定情況下它也可以優化為常數,但我想知道是否有人真的知道%的時間復雜度,以便我可以正確確定算法的整體時間復雜度。

當然,我知道復雜性可能會因實現而異,但我只對標准實現感興趣。

這不是那么容易確定,因為如果我們談論整數數學,cpython 使用不同的優化(例如,對於不超過機器字的整數,它可能是 O(1),而對於其他人,它可能是其他)。 所以有兩種方法:第一種是查看 cpython 源,第二種是測量性能(例如使用 timeit),然后根據實驗點構建外推曲線。 第二種方法更好,因為您會得到准確的結果,而不是猜測。 為了簡單的目的,建立一個實驗點的圖就足夠了,如果你想要更多,你也可以使用一些回歸分析方法(如最小二乘多項式擬合)。

這是 cpython 中 int 實現的來源(查找 long_divrem 和 x_divrem 例程): https ://hg.python.org/cpython/file/tip/Objects/longobject.c

補充:對於 unsigned int modulo,其使用 Knuth 書中的算法,即 O(MN),其中 M+1 是商中的機器字數,N 是余數中的機器字數。 對於簽名,它使用自己的實現

對於大整數,Python 除法(和模)使用 O(n^2) 算法。 乘法使用的是 O(n^1.585) 的 Karatsuba 乘法,但除法使用基本的“小學”除法。

暫無
暫無

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

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