[英]Time and Space Complexity Trouble
我已經看到了很多時間復雜性問題,但似乎沒有一個對我的理解有所幫助-就像真正理解它一樣。
我從閱讀和實踐嘗試中學到的東西似乎都可以歸結為這里提到的內容: 確定答案編碼器給出的遞歸函數的復雜度(Big O表示法) -實際上,這確實幫助我了解了更多有關情況的信息。開啟時間復雜度。
這樣的函數呢:
def f(n):
if n < 3:
return n
if n >= 3:
return f(n-1) + 2*f(n-2) + 3*f(n-3)
由於該函數調用了3次函數,這是否意味着時間復雜度為O(3 ^ n)?
至於空間復雜度,它似乎是線性的,因此我建議復雜度為O(n)。
我對此有錯嗎?
由於該函數調用了3次
這並不是真的正確,而是讓我們使用比臨時示例更精確的示例。
def constant(n):
return n*12301230
這將始終在相同的時間內運行,因此為O(1)
def linear(n):
total = 0
for x in xrange(n):
total+=1
return total
這有O(N)時間
def quadratic(n):
total = 0
for x in xrange(n):
for y in xrange(n):
total+=1
return total
由於內部循環運行了n次,外部循環運行了n次,因此它以二次時間O(N ^ 2)運行。
對於log(N),N * log(N),(2 ^ N)等,還有更具體的示例,但請回到您的問題:
由於該函數調用了3次函數,這是否意味着時間復雜度為O(3 ^ n)?
如果該函數被調用3次,則對於constant(x)
仍然是恆定時間,對於linear(x)
仍然是線性,對於quadratic(x)
仍然是quadratic(x)
。 重要的是,O(3 ^ n)是指數時間,與n ^ 3不同。 然后,我們將不使用3作為基數,而是使用2 ^ n作為標准。
因此,對於x <3,您的函數將具有恆定的時間。 最好地近似於您的函數所提供的功能,我會通過一個計時器運行它,但是它是遞歸的並且難以計算。 如果您提供另一個非遞歸示例,我很樂意告訴您它的復雜性。
希望這會有所幫助,該圖不能說明2 ^ n比n ^ 2增長得快多少,但這是一個好的開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.