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

将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)

你可能感兴趣的:(算法)