[英]What is the complexity of str() function in Python3?
我必須創建一個考慮 O(n) 復雜度的 function 並為此我想使用 str() function。
如果出現以下情況,有人可以向我解釋:
str(1000)
由於 1+0+0+0,這個代碼是 O(1) 還是 O(4)?
從源代碼中可以看出, int.__str__
的實現具有O(m*n)
的運行時復雜度,其中m
是二進制位數, n
是十進制位數。 由於對於 integer i
,任意基數b
中的位數由log(i, base=b)
給出,並且不同基數中的對數僅相差一個常數,因此運行時復雜度為O(log(i)**2)
,即位數的二次方。
這可以通過運行性能測試來驗證:
import perfplot
perfplot.show(
setup=lambda n: 10**n,
kernels=[str],
n_range=range(1, 1001, 10),
xlabel='number of digits',
)
CVE-2020-10735的問題中還提到了位數的二次時間復雜度:
[...] 一個巨大的 integer 在與具有大量數字的以 10 為底的(十進制)字符串之間轉換時,總是會消耗近二次的 CPU 時間。 不存在有效的算法來做其他事情。
在數據結構的上下文中, O(n)
僅表示如果有n
項目,那么對該結構的操作將需要(按順序) n
次迭代或傳遞才能達到所需的結果。 如果您從 integer 構造一個字符串,那么我猜復雜度將是O(log10(n))
編輯:來自Python 文檔:
如果既沒有給出編碼也沒有給出錯誤,str(object) 返回 object。 str (),它是 object 的“非正式”或可很好打印的字符串表示形式。
Python 檢測到 object 是一個int
,因此它將從該 int 創建一個字符串。 實現這種轉換的一種方法是:
if n == 0:
return "0"
negative = n < 0
if negative:
n = -n
out = ""
while n > 0:
digit = n % 10
n /= 10
out = chr(48 + digit) + out
if negative:
out = "-" + out
while 循環內的迭代次數取決於 n 包含的十進制位數,即log10(n)
。
function 用於字符串轉換。 這意味着將每個值轉換為字符串。 復雜度取決於長度。 如果全長是n,那么復雜度將是O(n)。 如果大小是一個固定的數字,在這種情況下它將執行一個恆定的大小。 我們將常數表示為 O(1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.