九章算法面试题62 合并k个排序数组
来源:互联网 发布:淘宝哪些卖aj 编辑:程序博客网 时间:2024/04/28 16:51
九章算法官网-原文网址
http://www.jiuzhang.com/problem/62/
题目
给出K个排序好的数组,用什么方法可以最快的把他们合并成为一个排序数组?
在线测试本题
http://lintcode.com/en/problem/merge-k-sorted-lists/
解答
这中题目分布式系统经常运用到,比如来自不同客户端的排序好的链表想要在主服务器上面合并起来。
一般这种题目有两种做法。
第一种做法比较容易想到,就是有点类似于MergeSort的思路,就是分治法。先把k个list分成两半,然后继续划分,知道剩下两个list就合并起来,合并时会用到类似 Merge Two Sorted Lists 这道题的思路。 这种思路我们分析一下复杂度,如果有k个list,每个list最大长度是n,那么我们就有分治思路的复杂度计算公式 T(k) = 2T(k/2)+O(n*k)。 其中T(k)表示k个list合并的时间复杂度,用主定理可以算出时间复杂度是O(nklogk)。
第二种做法是运用堆,也就是我们所说的priority queue。我们可以考虑维护一个大小为k的堆,先把每个list的第一个元素放入堆之中,然后每次从堆顶选取最小元素放入结果最后的list里面,然后读取该元素所在list的下一个元素放入堆中,重新维护好堆,然后重复这个过程。因为每个链表是有序的,每次又是取当前k个元素中最小的,所以最后结果的list的元素是按从小到大顺序排列的。这种方法的时间复杂度也是O(nklogk)。
0 0
- 九章算法面试题62 合并k个排序数组
- 九章算法面试题86 合并排序数组
- 九章算法面试题5 有序数组合并
- [各种面试题] 合并k个排序链表
- 九章算法面试题82 合并有序链表
- 算法面试题:求最小的k个束/求数组中最小的k个数
- 九章算法面试题33 数组波峰
- 九章算法面试题39 分割数组
- 九章算法面试题84 奇偶分割数组
- 九章算法面试题87 最小子数组
- 九章算法面试题32 小球排序
- 九章算法面试题65 拓扑排序
- 九章算法面试题8 第k大的数
- 九章算法面试题9 前k大的和
- 九章算法面试题64 找第k大的特殊数
- 面试题整理 4 合并两个排序的数组
- [剑指offer]面试题17:合并两个排序的数组
- 九章算法面试题3 找坏球
- 九章算法面试题60 爬楼梯
- 数据结构之关于树的操作(树的递归和非递归遍历)-(四补)
- 九章算法面试题61 克隆图
- Android Activity 设置背景图片
- android异常处理:线程退出(dvmDetachCurrentThread)检查未处理异常(dvmCheckException)-threadExitUncaughtException
- 九章算法面试题62 合并k个排序数组
- 九章算法面试题63 快速幂
- 九章算法面试题64 找第k大的特殊数
- 九章算法面试题65 拓扑排序
- PCL 库中的pcl::visualization::PCLVisualizer类彩色显示点云
- 九章算法面试题66 2 sum
- android异常处理:未处理异常->线程退出->检查异常->处理
- 九章算法面试题67 3 sum
- 九章算法面试题68 4 sum