簡體   English   中英

如何計算 O(n) 中未排序頻率表的中位數?

[英]How to calculate median of an unsorted frequency table in O(n)?

我有一個數據集,由n 個未排序的元組組成,這些元組表示數字(比如說特定的顏色代碼)和它們的頻率(出現的次數)。

我想找到最壞情況復雜度為O(n)的數字的確切中位數。

例如:

dataset: {(5000, 8000), (25000, 4000), (9, 9000)} median: 5000

dataset: {(7000, 4), (23000, 400), (3000, 9000), (2500, 12000), (19000, 350), (500, 9000)....} median: ?

到目前為止失敗的嘗試:

  1. “解壓縮”列表(使其看起來像這樣: {7000, 7000, 7000, 7000, 23000, 23000...} )然后對其進行排序。 問題是 - 它需要 Ω(n log n),並且可能更多,因為頻率可能非常大並且沒有任何上限。
  2. 嘗試對數據使用 QuickSelect。 為了確保O(n)時間復雜度,我們必須保證良好的樞軸選擇。 為此,我考慮了中位數的中位數(假設為O(n) )與數據 - 但我無法弄清楚如何在不解壓縮的情況下做到這一點,因此它可能超過O(n)

有沒有辦法操縱元組列表,使其不會被解壓縮並仍然使用中位數的中位數或其他方法來查找中位數?

尾注:我不想假設關於數據集的任何事情——元組的數量、有限的數字/頻率范圍等)。

在值上使用快速選擇,並且只注意確定保留哪一半的頻率。

您理想的樞軸是將列表值分成兩半的樞軸。 因為這會將下一次傳球的工作減半。 在整個數據集中發生這種分裂的地方並不特別。 因為你的目標是把它降到你想要的一個值,然后你就完成了。

這意味着對於中位數的中位數,您可以在選擇樞軸時完全忽略頻率。 然后在決定保留樞軸的哪一側時注意頻率。 並在選擇下一個樞軸時再次忽略頻率。

暫無
暫無

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

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