簡體   English   中英

在O(nk)時間復雜度中合並k個排序大小為n的數組

[英]Merge k sorted arrays of size n in O(nk) time complexity

最近在接受采訪時我被問到這個問題:

將每個具有n個元素的k個排序數組合並到一個大小為n k 的單個數組中,時間復雜度最小。*

我使用大小為k的minheap給出了一個解決方案,以找到k列表的頂部元素的最小值。

這樣,時間復雜度將降至-O(nklogk)。

但他並不相信。 他想要一個時間復雜度為O(nk)的解決方案。

我在網上搜索過,但找不到解決辦法。

他錯了,你是對的。 或者這可能是一個棘手的問題。

如果存在這樣的解決方案,您可以在O(K)中對任何大小為K的數組進行排序,這被證明是不可能的。

方法如下:您只需將大小為K的數組划分為K個單例數組,然后應用您的魔術函數。

當然,單例數組都是單獨排序的。 復雜性:O(K)用於構建單例數組,O(K * 1)用於合並(根據我們反駁的假設)。

雖然你說得對,任何比較排序的下限是n * log(n)[其中n是數組的大小],但是排序算法可以花費更少的時間。

由於您有k個排序列表,因此很容易找到最終要獲得的列表的最小值(稱為m)和最大值(稱為M)值。 現在你知道你需要排序的每個元素都在m和M之間。所以你可以使用Counting Sort,它需要線性時間。 [ https://en.wikipedia.org/wiki/Counting_sort]

因此,需要O(k)來找到m和M然后O(n * k)來對數組進行排序。 所以整個算法需要O(nk)

暫無
暫無

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

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