一道多路归并算法分析的题目
来源:互联网 发布:数据实时可视化 编辑:程序博客网 时间:2024/06/05 20:34
将N条长度均为M的有序链表进行合并,合并以后的链表也保持有序,时间复杂度为()?
A.O(N * M * logN)
B.O(N*M)
C.O(N)
D.O(M)
答案为A
一道牛客上的题目,答住philian提出用归并算法来解,首先归并算法的时间复杂度。
第一种解法:
T(1) = 1T(n) = 2T(n/2) + nT(n/2)/(n/2) = T(n/4)/(n/4) +1T(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) + n2T(n/2) = 2(2(T(n/4))+n/2) = 4T(n/4)+nT(n) = 4T(n/4) + 2n4T(n/4) = 4(2(T(n/8))+n/4) = 8T(n/8)+nT(n) = 8T(n/8)+ 3n类推得T(n) = 2^k(n/2^k) + kn明显k=lognT(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 0
- 一道多路归并算法分析的题目
- 一道简单题目的数据结构算法分析
- 一道c++的算法题目
- 一道算法题目的解法
- 听来的一道算法题目
- 一道关于加载顺序的题目分析
- 一道简单题目的复杂算法
- 分享一道很有意思的算法题目
- 分享一道很有意思的算法题目
- 一道算法题目,值得一看
- 一道算法题目
- k路归并算法的分析和实现
- k路归并算法的分析和实现
- 对一道题的算法分析
- 一道算法面试题的分析
- 一道微软公司的面试题目的算法实现
- 一道 快速排序算法 题目
- 一道题目引发的多角度思考
- 整数奇偶排序
- opencv3 画轮廓
- Spring注解@Component、@Repository、@Service、@Controller区别
- 字符串转化
- 内购遇见的那些坑
- 一道多路归并算法分析的题目
- Hibernate持久化技术
- 0-6矩阵
- L2-018. 多项式A除以B
- 大文件Excel,csv等快速导入数据库
- 数据结构作业——动态数组
- android的弹窗和几种动画的用法_2017.09.14
- Netty自娱自乐之类Dubbo RPC 框架设计构想 【上篇】
- cobbler无人值守自动安装(centos7,Redhat6)