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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值