簡體   English   中英

如何以最有效的方式將兩個未排序的數組合並為一個已排序的數組?

[英]How to merge two unsorted array into a sorted one in the most efficient way?

假設我們有兩個 arrays:

A[] = {7, 15, 2};     //*Size: n* 

B[] = {5, 96, 15};    //*Size: m*

我們想要得到c[] = {2, 5, 7, 15, 15, 96}

我有一個天真的方法:首先對 arrays AB進行排序,然后將它們合並以獲得c

時間復雜度:O (nlogn + mlogm + (n + m))

空間復雜度:O ( (n + m) )

但是有沒有有效的方法呢?

不,它不能做得更好,因為對於一般情況排序,這意味着排序比O(nlogn)更快。 (在漸近時間復雜度方面)

首先,請注意, O(nlogn + mlogm) = O((n+m)log(n+m)

不失一般性, n <= m (否則只需切換數組)。

nlogn + mlogm <= (n+m)log(n+m) + (n+m)log(n+m) = 2(n+m)log(n+m)
which is in O((n+m)log(n+m))
(n+m)log(n+m) <= 2n*log(2n) <= 2n*log(2n) + 2m*log(2m) <= 2(nlog(n) +mlog(m) + nlog(2) + mlog(2))
which is in O(nlogn + mlogm)

這意味着,就漸近時間復雜度而言,建議的方法並不比組合 arrays 並在完成后排序更好。

現在,假設這可以在O(f(n,m))中完成,其中f(n)o((n+m)log(n+m))中(這里有小 o 符號)。 這意味着,對於任何給定的數組 - 您可以將其拆分為兩個 arrays,然后運行建議的算法。 這與排序是Omega(nlogn)問題這一事實相矛盾。

暫無
暫無

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

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