[英]What algorithm used to find the nth sorted subarray of an unordered array?
我最近在一次采訪中遇到了這個問題,但我失敗了,現在尋找答案。
假設我有一個由 n 個整數組成的大數組,全都不同。
如果這個數組是有序的,我可以將它細分為 x 個更小的數組,所有的大小都是 y,除了最后一個可能更小。 然后我可以提取第 n 個子數組並返回它,已經排序。
示例:數組 4 2 5 1 6 3。如果 y=2 並且我想要第二個數組,它將是 3 4。
現在我所做的只是對數組進行排序並返回第 n 個子數組,它需要O(n log n
)。 但有人對我說,在O(n + y log y)
中有一種方法可以做到這一點。 我在互聯網上搜索並沒有找到任何東西。 想法?
您可以為此組合std::nth_element
和std::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.