一道多路归并算法分析的题目
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(n) /n = T(1)+logn=>T(n)=nlogn+n=O(nlogn)
第二种解法:
回到本题,因为长度为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)
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)
相关文章推荐
- 一道简单题目的数据结构算法分析
- Python排序搜索基本算法之归并排序实例分析
- 简便方法求解一道算法题目
- 每天一道算法题目(20)——复杂链表的拷贝
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 公司的一道考试题算法分析——大数据量整数排序
- 一道算法题目的思考
- 对一道“写一个算法实现字符串逆序存储,要求不另设串存储空间.”题目的总结!
- 归并算法的JS实现及分析(分治,递归,归并)
- 每天一道算法题目(20)——复杂链表的拷贝
- 百度一道关于算法的面试题目
- LeetCode上面一道算法题目:79. Word Search
- 数字字符串一道有道实习生笔试算法题分析
- 分析一道运维bash脚本题目
- 一道100年后羊圈羊的数量经典算法分析
- 每天一道算法题目——最大公约数
- 算法分析与设计的一些题目
- k路归并算法的分析和实现
- array专题3-一道题目不断分析就会慢慢有了思路
- 公司的一道考试题算法分析——大数据量整数排序