簡體   English   中英

漸近符號有缺陷嗎?

[英]Are asymptotic notations flawed?

任何算法的最佳情況復雜度是算法完成其任務所需的最短時間。 我們知道合並排序、快速排序等算法的最佳情況復雜度是 Ω(n log(n)),它定義了這些算法的下限。

正如我們所知,在漸近符號中 -

O(n) + O(n log(n)) = O(n log(n))

還,

Ω(n) + Ω(n log(n)) = Ω(n log(n))

因此,如果在這些排序算法中,我們首先在 O(n) 時間內遍歷整個數組以確定該數組是否已經按升序或降序排序,那么它們的平均情況和最壞情況復雜度將漸近保持不變。 但是他們最好的情況復雜性現在將變為Ω(n)

從邏輯上講,我理解這些漸近符號的方式肯定存在缺陷,否則當漸近符號正在開發或流行以測量排序算法時,肯定有人會指出這一點。 我是否正確假設這是漸近符號中的一個似是而非的缺陷,還是我錯過了一些漸近符號規則?

使用漸近復雜度作為速度度量肯定存在問題。 首先,顯然常數很重要。 1000n通常會比n log n大得多,對於 n 的任何實際值, n n^1000肯定比2^n大得多。 然而,事實證明,漸近復雜度通常是算法實際速度的一個相當好的指標。

你提出的問題也是正確的,但我不認為這是一個問題。 確實,在快速排序開始時進行簡單的isSorted()檢查會將其最佳案例復雜度降低到Θ(n) ,但很少有人關心最佳案例性能。 事實上,許多常見問題的算法都可以修改為最佳情況線性,但這並不是很有用。

最后,請注意,這並不是漸近符號的真正缺陷。 進行隨機猜測並驗證猜測是否正確(例如通過猜測數組已經排序)通常確實可以提高最佳情況的性能,而對平均或最壞情況的影響很小,無論使用哪種表示法。

首先,您應該在腦海中區分情況(最佳、最差、平均等)和界限(上限、下限、O、Omega、Theta 等)。

讓我們專注於冒泡排序,定義如下:

if array == null or array.length < 2 then return
do
    swapped = false
    for i = 0 to array.length - 2
        if array[i] > array[i+1] then
            swap(array, i, i+1)
            swapped = true
until not swapped

該算法的最佳情況是排序數組,在這種情況下,下限 (Omega)、上限 (O) 和 Theta 界限都同意運行時由 f(n) = an 形式的 function 限制; 也就是說,T(n) = O(n)。 冒泡排序的最佳情況是線性的。

該算法的最壞情況是反向排序的數組。 在這種情況下,運行時間由 function 上下限定,例如 g(n) = bn^2; 在最壞的情況下,T(n) = O(n^2)。

您不會遺漏任何東西,算法具有不同的最壞情況和最佳情況運行時界限是完全正常的。 算法也很可能無法針對最佳情況進行優化,因為最佳情況通常不是我們擔心的情況; 是的,歸並排序可以首先檢查數組是否已排序,但是在長度為 N 的所有可能的 arrays 的集合中,這些數組的數量相對較少。

此外,您可以選擇談論最壞情況下的下限或最佳情況下的上限。 這些事情不是我們通常關注的——而是關注最壞情況的上限,或者可能是最好情況的下限——但情況和邊界是完全獨立的事物,可以任意組合。

暫無
暫無

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

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