簡體   English   中英

快速選擇時間復雜度解釋

[英]Quickselect time complexity explained

https://en.wikipedia.org/wiki/Quickselect它說

“然而,不像快速排序那樣遞歸到兩邊,quickselect 只遞歸到一側——它正在搜索的元素所在的一側。這將平均復雜度從 O(n log n) 降低到 O(n),其中O(n^2) 的最壞情況。”

我不明白減少到只看一側如何將平均復雜度降低到 O(n)? 是不是更多的 O(N/2 log N) 仍然是 O(N log N)。 最壞的情況如何 O(n^2)

n log(n)意味着該算法查看所有 N 項 log(n) 次。 但這不是 Quickselect 發生的情況。

假設您正在使用 Quickselect 選擇 128 個列表中的前 8 個項目。通過隨機選擇的奇跡,您選擇的支點始終位於中間點。

在第一次迭代中,該算法查看所有 128 個項目並將其划分為兩組,每組 64 個項目。 下一次迭代分為兩組,每組 32 個項目。 然后是 16,然后是 8。 檢查的項目數是:

N + N/2 + N/4 + N/8 + N/16

該系列的總和永遠不會達到 2*N。

最壞的情況是分區總是導致分區大小非常傾斜。 考慮如果第一個分區只刪除一個項目會發生什么。 第二個只刪除了一個,等等。結果是:

N + (N-1) + (N-2) ...

(n^2 + n)/2)或 O(n^2)。

一張值一百行的圖片:

這種序列的和將無限接近 1 但不等於 1。

當我讀到平均時間復雜度為 O(n) 而我們每次將列表分成兩半(如二分搜索或快速排序)時,我也感到非常矛盾。 為了證明只看一側將平均運行時復雜度從 O(n log n) 降低到 O(n),讓我們比較快速排序(2 側)和快速選擇(1 側)的時間復雜度遞推關系。

快速排序:

T(n) = n + 2T(n/2)
     = n + 2(n/2 + 2T(n/4))
     = n + 2(n/2) + 4T(n/4)
     = n + 2(n/2) + 4(n/4) + ... + n(n/n)
     = 2^0(n/2^0) + 2^1(n/2^1) + ... + 2^log2(n)(n/2^log2(n))
     = n (log2(n) + 1)      (since we are adding n to itself log2 + 1 times)
 

快速選擇:

 T(n) = n + T(n/2)
      = n + n/2 + T(n/4)
      = n + n/2 + n/4 + ... n/n
      = n(1 + 1/2 + 1/4 + ... + 1/2^log2(n))
      = n (1/(1-(1/2))) = 2n                           (by geometric series)

我希望這能讓你相信為什么從一側看會有所不同!

它的復雜度幾乎是Θ(N)(Everage O(N))

假設目標索引為 1,這意味着我們要找到最小元素:

  • 第一個循環:檢查整個 [1, N] 和分區,近 N 個操作。
  • 第二個循環:檢查整個 [1, x] 和分區,接近 N/2 次操作。
  • 第三個循環:檢查整個 [1, y] 和分區,將近 N/2 次操作。
  • ...

最終循環:檢查整個 [1, 1],arr[1] 是我們的目標,1 次操作。

因此,復雜度約為:

T = T(N + N/2 + N/4 + ... + 1) 
     = T(1*(1-2^(logN))*(1-2)) 
     = T(2^(logN) - 1) 
     = Θ(N)

這個表達可能太簡單了,但希望它可以幫助你。 順便說一下,這是quickselect 的平均復雜度,因為quicksort/quickselect 的性能可能會因列表值分布和目標索引而波動。 您可以查看https://en.wikipedia.org/wiki/Quickselect了解更多詳情。

暫無
暫無

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

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