给出两个大小为M
和N
的未分类的单个链接列表。任务是创建单个已排序的链接列表。不应创建新节点。
我想到了两种方法。
在MlogM和NlogN中单独对每个列表进行排序。然后合并两个排序列表 时间复杂度:O(MlogM + NlogN)
将第二个列表附加到第一个列表的末尾。然后对列表进行排序 时间复杂度:O((M + N)log(M + N))
哪种方法更好?
还有更好的方法吗?
答案 0 :(得分:4)
渐渐地说 - 它是一样的。
如果n<m
则:
O(nlogn+ mlogm) = O(mlogm)
and
O(n+m)log(n+m)) = O(nlog(n+m) + mlog(n+m)) = O(nlog(m) + mlog(m)) = O(mlogm)
对称,如果m<n
两者都是O(nlogn)
事实上,对于n=m
,方法1是merge sort
答案 1 :(得分:0)
无论如何,approch 1是好的。如果
,请参阅此计算n = 2且m = 3 nlogn = 0.60,mlogm = 1.43,nlogn + mlogm = 2.03而 (n + m)log(n + m)= 3.49
n = 2且m = 30 nlogn = 0.60,mlogm = 44.31,nlogn + mlogm = 44.91 (n + m)log(n + m)= 48.16
n = 2且m = 300 nlogn = 0.60,mlogm = 743.14,nlogn + mlogm = 743.74
而(n + m)log(n + m)= 748.96
n = 2且m = 3000 nlogn = 0.60,mlogm = 10,431.36,nlogn + mlogm =
10,431.96而(n + m)log(n + m)= 10,439.18
n = 2且m = 30000 nlogn = 0.60,mlogm = 134,313.64,nlogn + mlogm =
134,314.24而(n + m)log(n + m)= 134,323.46
n = 2且m = 300000 nlogn = 0.60,mlogm = 1,643,136.38,nlogn + mlogm = 1,643,136.98而(n + m)log(n + m)= 1,643,148.19
因为,这背后的明显原因是:无论如何,
(n+m) > n & (n+m) > m
log (n+m) >= log n
log (n+m) >= log m
在n = m的情况下,
nlogn + mlogm = 2m logm
= log m (power of 2m)
(n+m) log(n+m) = 2m log (2m)
= log 2m (power of 2m)
and m(power of 2m) < 2m(power of 2m)
选择第一个approch的唯一简单原因是,与大型数组相比,排序一小部分数据的时间更短。