我知道大O符號是衡量一個函數效率的一個度量,但我真的不知道如何計算它。這個函數的大O符號是什麼?
def method(n)
sum = 0
for i in range(85)
sum += i * n
return sum
答案是否是O(f(85))?
我知道大O符號是衡量一個函數效率的一個度量,但我真的不知道如何計算它。這個函數的大O符號是什麼?
def method(n)
sum = 0
for i in range(85)
sum += i * n
return sum
答案是否是O(f(85))?
你有4個「動作」功能,來計算其大O上,我們需要計算大O字的每一個動作,然後選擇最高:
因此,只要lenI和lenN是常數(通常爲32或64位),max(lenI,lenN)就是可能的最大大O是#2,即1 * O(#3) - > 32/64,所以你的函數的總複雜度是O(1 * 1)= O(1)
如果我們有大的數學,即N的位長度可以非常長,那麼我們可以說O(位長N)
注:位長N實際上是LOG2(N)
在理論上,複雜度爲O(log n)的。隨着n
增長,讀取數字並執行乘法需要更長的時間。
但是,在實踐中,n
的值受到限制(有一個最大值),因此可以在O(1)時間內讀取並執行操作。由於我們重複O(1)操作一定的時間,所以複雜度仍然是O(1)。請注意,O(1)表示常量時間 - O(85)並不意味着任何不同。如果在一個序列中執行多個常量時間操作,則除非序列的長度取決於輸入的大小,否則結果仍爲O(1)。執行O(1)操作1000次仍然是O(1)
,但這樣做n
次是O(n)
。
如果你想真的玩起來安全,就說O(∞)
,那絕對是一個正確的答案。然而,CS教師在實踐中往往不會真正欣賞它。
當談到複雜性時,總是應該說什麼操作應該被視爲恆定時間(最初的協議)。這裏可以考慮整數乘法或者是不變的。無論如何,這個例子的時間複雜度比O(n)好。但這是老師對學生的詭計 - 有點兒。 :)
這裏的運行時間似乎是不變的(即不變的'n')... –