![](/img/trans.png)
[英]Most efficient way to merge sorted collections into a new sorted collection?
[英]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 A和B進行排序,然后將它們合並以獲得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.