2013-06-04 18 views
4

比方說,我們有一個1.000.000元素的數組,我們通過它們檢查一些簡單的東西,例如,如果第一個字符是「A」。從我(很少)的理解中,複雜度將是O(n),它將花費大約X的時間。如果我添加另一個IF(不是如果)來檢查,比方說,如果最後一個字符是「G」,它將如何改變複雜性?它會增加複雜性和時間嗎?像O(2n)2XIF如何影響複雜性?

我想避免考慮不同命令必須進行的計算次數。例如,我明白Len()需要更多的計算才能給出結果,而不是簡單的char比較,但假設IF中使用的命令將具有(幾乎)相同的複雜度。

回答

11

O(2n) = O(n)。推廣,O(kn) = O(n),與k是一個常數。當然,使用兩個IF可能需要兩倍的時間,但執行時間仍然是輸入大小的線性函數。

編輯Here是一個解釋,舉例,大O符號的這是不是太數學爲本

+0

非常感謝。我沒有理解複雜性和時間之間的關係。 –

+0

偉大的聯繫,我以爲我知道大O之前,現在我真的知道它! –

3

漸近複雜性(這是什麼大O使用),不依賴於持續性因素,更具體地說,您可以向該函數添加/刪除任何常數因子,並且它將保持等效(即O(2n)= O(n))。

假設if語句需要一段時間,它只會爲複雜性添加一個常數因子。

A「的時間常數量」是指:

  • 採取,如果語句對於給定的元件的時間不依賴於有多少其它元件有陣列中
  • 所以基本上,如果它不會調用一個函數,以某種方式或類似的方式查看數組中的其他元素
  • 任何非函數調用if語句可能都沒問題(除非它包含通過數組的語句,某些語言允許)

因此,爲每個元素調用的2(常量時間)if語句將是O(2n),但是這等於O(n)(好吧,它可能不是真正的2n,注意)。

有關更多詳細信息和更正式的定義,請參見Wikipedia

備註:除了不依賴於常數因子,它也不依賴漸近較小的項(無論n有多大都保持較小的項),例如, O(n)= O(n + sqrt(n))。而大O只是一個上界,所以說這是O(n )也是正確的(儘管說在考試/考試中可能會得到0分)。

附加說明:問題時忽視持續性因素是 - 什麼是工作單位劃分?這裏沒有標準的定義。一種方法是使用時間最長的操作,但是確定這可能並不總是直截了當,也不總是特別準確,也不能一般比較不同算法的複雜性。

-2

這與我今天發佈的問題有關。

在你的例子中,它取決於你是否可以從第一個元素跳到最後一個元素,如果你不能,那麼它也取決於每個條目的平均長度。

如果你仔細查看了每個完整條目,以便評估你的兩條if語句,那麼你的訂單將是O(1,000,000xN),其中N是每個條目的平均長度。如果N是可變的,那麼它會影響訂單。一個例子是標準乘法,其中我們執行Log(N)長度爲Log(N)的條目,因此順序爲O(Log^2(N)),或者如果您更喜歡O((Log(N) )^ 2)。

另一方面,如果你只能檢查第一個和最後一個字符,那麼N = 2並且是常數,因此可以忽略。

這是一個重要的觀點,你必須小心,因爲如何決定你的倍數是否可以被忽略。例如,我們正在做Log(N/100)號的Log(N)添加。現在只是因爲Log(N/100)是較小的術語並不意味着我們可以忽略它。如果可變,乘數不能忽略。

+1

-1常數不影響複雜性。它們可能會影響實際觀察到的運行時性能(嚴重如此),但這是另一回事。 – ComicSansMS

+0

正如我試圖澄清這取決於你的閱讀是一個常數因素。例如,如果你進行N次迭代並且你的「常數」因子是N,那麼你不能把N忽略爲常數。如果是這種情況,乘法將是Log(N)操作而不是Log(N^2)操作。我所說的常數與迭代次數相比要小。我應該補充一點,在這種情況下,N不是一個常量,因爲它取決於數組元素的平均大小,這是另一個變量。你可以設置一個固定的上限,這是你最糟糕的情況 –

+0

我認爲我們是交叉發佈。你錯過了我的編輯? N是另一個變量,它不是一個常量,在我原來的文章中我沒有把它稱爲一個變量,因爲這就是你提到它的原因。我們稱之爲倍數。關鍵在於,如果乘數與乘數相比較小,則只能忽略。糟糕的廢料,我看到我最後稱它爲常量。不是我的意思。我的意思是乘數,但是當我編輯並添加最後一個筆記時,我犯了一個錯誤。 –