簡體   English   中英

為什么我們在談論時間復雜度時使用漸近符號(因此忽略系數)?

[英]Why do we use asymptotic notations (thus ignoring coefficients) when talking about time complexity?

這個問題與“為什么我們忽略 Big-O 表示法中的系數”不同。

在測量時間復雜度時,我們通常使用忽略系數和非主導元素的 Big-O 表示法。 但是,2N+C 和 N+C 指令不會導致執行時間的顯着差異,尤其是當問題規模變得非常大時? 前者將比后者多花費兩倍的時間,與現實世界大規模計算中的一周相比,這可能是兩周。

示例包括快速排序與其他 O(NlogN) 排序算法以及瑣碎的 O(N^3) 矩陣乘法與 Strassen 算法(可能會更慢,因為即使指數較小,前導系數也會大得多)

簡而言之:因為它太難了。

准確找出這些系數是什么需要硬件 model:為算法使用的每個原語分配一個成本。 在存在現代優化編譯器、亂序執行和 memory 緩存層次結構的情況下,這是一個幾乎難以解決的問題。

如果您想要對它們的值進行一些估計,那么計算漸近復雜度公式會更容易(並且可能更准確),針對不同的問題大小運行一些基准測試並將系數擬合到獲得的數據。

我們使用漸近符號,所以我們可以談論算法的效率,而不是特定計算機的效率。

如果您編寫的程序需要 f(n) 秒才能在您的機器上運行...

同樣的程序在速度更快的機器上可能需要 f(n)/10 秒,但這仍然是 O(f(n))。

在慢得多的機器上,相同的程序可能需要 f(n)*10 秒,但這仍然是 O(f(n))。

有些機器可能有不同的硬件,所以它在浮點數學上更快,但在 memory 訪問時更慢。 在該機器上運行程序所需的時間可能會更快或更慢,具體取決於特定的輸入,但它仍然是 O(f(n))。

運行程序所需的時間取決於很多因素,但漸近復雜度是算法本身的屬性。 這就是我們使用它來評估算法的原因。

因為大 O 表示法告訴您算法的性能與所使用的語言、編譯器/解釋器或平台無關。 與流行的看法相反,big-O 不能預測運行時間。 相反,它會告訴您算法如何隨輸入擴展 無論給定大小的輸入需要多長時間,如果將輸入的大小加倍,具有 O(n 2 ) 復雜度的算法將漸近花費 4 倍的時間,如果將輸入增加 10 倍,則將花費 100 倍的時間等,無論您選擇何種語言、編譯器或平台。

暫無
暫無

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

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