簡體   English   中英

什么算法用於找到無序數組的第 n 個排序子數組?

[英]What algorithm used to find the nth sorted subarray of an unordered array?

我最近在一次采訪中遇到了這個問題,但我失敗了,現在尋找答案。

  1. 假設我有一個由 n 個整數組成的大數組,全都不同。

  2. 如果這個數組是有序的,我可以將它細分為 x 個更小的數組,所有的大小都是 y,除了最后一個可能更小。 然后我可以提取第 n 個子數組並返回它,已經排序。

示例:數組 4 2 5 1 6 3。如果 y=2 並且我想要第二個數組,它將是 3 4。

現在我所做的只是對數組進行排序並返回第 n 個子數組,它需要O(n log n )。 但有人對我說,在O(n + y log y)中有一種方法可以做到這一點。 我在互聯網上搜索並沒有找到任何東西。 想法?

您正在尋找的算法是選擇算法,它可以讓您在線性時間內找到k 階統計數據 該算法相當復雜,但標准 C++ 庫方便地提供了它的實現

面試官想到的尋找第 k 個排序區間的算法是這樣的:

  • 在 O(N) 中找到b=(k-1)*y -th order statistics
  • 在 O(N) 中找到e=k*y -th order statistics
  • be之間會有y數字。 將它們存儲在大小為y的單獨數組中。 此操作需要 O(N)
  • 為 O(y * log 2 y) 成本對大小為y的數組進行排序。

總成本為O(N+N+N+y * log 2 y),即O(N+y * log 2 y)

您可以為此組合std::nth_elementstd::sort

std::vector<int> vec = muchData();
// Fix those bound iterators as needed
auto lower = vec.begin() + k*y;
auto upper = lower + y;

// put right element at lower and partition vector by it
std::nth_element(vec.begin(), lower, vec.end());
// Same for upper, but don't mess up lower
std::nth_element(lower + 1, upper - 1, vec.end());
// Now sort the subarray
std::sort(lower, upper);

[lower, upper)現在是長度為 y 的第 k 個排序子數組,平均具有所需的復雜度。

在實際使用之前檢查y = 1等特殊情況,但這是一般的想法。

暫無
暫無

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

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