您的位置:首页 > 其它

一道多路归并算法分析的题目

2017-09-15 18:39 387 查看
将N条长度均为M的有序链表进行合并,合并以后的链表也保持有序,时间复杂度为()?

A.O(N * M * logN)

B.O(N*M)

C.O(N)

D.O(M)

答案为A

一道牛客上的题目,答住philian提出用归并算法来解,首先归并算法的时间复杂度。

第一种解法:

T(1) = 1
T(n) = 2T(n/2) + n
T(n/2)/(n/2) = T(n/4)/(n/4) +1
T(n/4)/(n/4) = T(n/8)/(n/8) +1
.
.
.
T(2)/2 = T(1) +1


将左侧右侧分别相加,消除掉得到T(n) /n = T(1)+logn=>T(n)=nlogn+n=O(nlogn)

第二种解法:

T(n) = 2T(n/2) + n
2T(n/2) = 2(2(T(n/4))+n/2) = 4T(n/4)+n
T(n) = 4T(n/4) + 2n
4T(n/4) = 4(2(T(n/8))+n/4) = 8T(n/8)+n
T(n) = 8T(n/8)+ 3n
类推得
T(n) = 2^k(n/2^k) + kn
明显k=logn
T(n) = nT(1)+nlogn = nlogn + n


回到本题,因为长度为M的子序列都已经有序,就相当于把上述从n到1的递归截了一块儿,截掉了M到1的递归部分,因此需要用总的时间复杂度减掉这被截去的一块儿。

n=N*M,因此如果递归到1,时间复杂度应为O(N*M*log(N*M))

而如果n=M,那么递归到1的时间复杂度为O(M*logM),共有N段这样的子序列,因此加起来需要O(N*M*logM)的时间

前后相减,O(N*M*log(N*M)- N*M*logM)=O(N*M*logN)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: