合并是一维数据结构中非经常见的操作, 一般是排序, 分布式算法中的子操作。 这篇总结主要介绍LeetCode中关于合并的几个题目: 
Merge Two Sorted Lists
Merge Sorted Array
Sort List
Merge k Sorted Lists

我们先来看看两个有序一维数据的合并, 这里主要是要介绍链表的合并操作, 只是由于一维数组的合并也比較简单, 并且与链表有比較性, 就顺便在这里列举一下。 Merge Two Sorted Lists就是要求合并两个有序链表, 一般来说合并的思路就是以一个为主參考, 然后逐项比較, 假设较小元素在參考链表中。 则继续前进。 否则把结点插入參考链表中。 前进还有一个链表。 最后假设还有一个链表还没到头就直接接过来就能够了, 思路和实现都比較简单。 最好力求一遍过哈。 Merge Sorted Array也是一样的思路, 仅仅是数据结构换成了一维数组, 所以插入操作比链表要麻烦一些。 这里相当于从尾部開始, 然后数字一个个依照位置填入。 插入操作在这里就不明显了。 能够看出尽管思路近似, 可是数据结构不同, 由于操作不同。 实现细节还是比較不一样的, 都得熟练掌握哈。

有了上面合并两个链表(或者数组)我们就能够进行归并排序了, 也就是Sort List这道题目。 对于链表。 用Merge Two Sorted Lists作为合并的子操作。 然后用归并排序的递归进行切割合并就能够了, 这里就不说排序的详细细节了。 会有专门的排序总结篇哈。

最后我们来说说最重要的也是最有用的一个题目Merge k Sorted Lists。 为什么说他有用是由于如今分布式系统非常多, 并且也非常强调MapReduce或者Hadoop的技术, 这个题目就是分布式计算的一个常见操作。 比方说来自不同client的有序数据要在central server上面进行合并。 这个问题有两种做法: 
第一种就是利用上面的Merge Two Sorted Lists对k个链表先进行两两合并, 然后再上一层继续两两合并。 直到合成一个链表。 依据Merge k Sorted Lists中的分析, 时间复杂度是O(nklogk), 空间复杂度是O(logk)。

上面这样的做法是利用分治然后进行合并的方法, 接下来这种方法用到了堆的数据结构。

思路是维护一个大小为k的堆, 每次取堆顶的最小元素放到结果中,然后读取该元素相应的链表的下一个元素放入堆中。

由于每一个链表是有序的, 每次又是去当前k个元素中最小的。 所以当全部链表都读完时结束,这个时候全部元素按从小到大放在结果链表中。 这个算法每一个元素要读取一次,即k*n次,然后每次读取元素要把新元素插入堆中要O(logk)的复杂度,所以复杂度是O(nklogk), 跟第一种方法是一样的。

两种方法不同的数据结构和类型, 都非常具有代表性。 个人认为都非常有意思哈。

合并算是链表中比較典型的操作, 也能够连续地问出比較连贯的一些题目, 扩展性非常好。 既能够考察基本数据结构的操作。 又能够看看对于算法和很多其它数据结构的理解, 是一个不错的面试话题。

LeetCode总结 -- 一维数据合并篇的更多相关文章

  1. LeetCode总结 -- 一维动态规划篇

    这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaxi ...

  2. PANDAS 数据合并与重塑(join/merge篇)

    pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...

  3. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  4. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  5. python 数据清洗之数据合并、转换、过滤、排序

    前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作, 数据清洗一直是数据分析中极为重要的一个环节. 数据合并 在pandas中可以通过merge对数据进行合并操作. import n ...

  6. angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)

    首先介绍下框架基本流程   (web > webservice  [前端架构] ) > (nodejs [ 数据中转站 ]) >(api [后台接口]) --web (html  a ...

  7. pandas学习(数据分组与分组运算、离散化处理、数据合并)

    pandas学习(数据分组与分组运算.离散化处理.数据合并) 目录 数据分组与分组运算 离散化处理 数据合并 数据分组与分组运算 GroupBy技术:实现数据的分组,和分组运算,作用类似于数据透视表 ...

  8. pandas:根据行间差值进行数据合并

    1. 问题描述 在处理用户上网数据时,用户的上网行为数据之间存在时间间隔,按照实际情况,若时间间隔小于阈值(next_access_time_app),则可把这几条上网行为合并为一条行为数据:若时间间 ...

  9. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

随机推荐

  1. 同时启动多个Tomcat服务器

    以下步骤能够同时启动两个tomcat:1.特别要注意:不要设置CATALINA_HOME 2.分别修改安装目录下的conf子目录中的server.xml文件: a.修改http访问端口(默认为8080 ...

  2. android 下的网络图片加载

    Android图片的异步加载,主要原理: 加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个默认的占位图片,同时创建一个通过网络获取图片的任务并添加,任务完成后放松消息给主线 ...

  3. 【架构】Kubernetes和Spring Cloud哪个部署微服务更好?

    Spring Cloud 和Kubernetes都自称自己是部署和运行微服务的最好环境,但是它们在本质上和解决不同问题上是有很大差异的.在本文中,我们将看到每个平台如何帮助交付基于微服务的架构(MSA ...

  4. word图片自动编号与引用(转)

    http://blog.csdn.net/hunauchenym/article/details/5915616 用Word时,可能会遇到文中使用了大量的图片的情况,这时,若采用手动为图片编号的方法, ...

  5. (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)

    NGUI系列教程七(序列帧动画)   今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...

  6. [mysql] C++操作mysql方法总结(1)

    From: http://www.cnblogs.com/magicsoar/p/3817518.html C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作 ...

  7. (数据挖掘-入门-3)基于用户的协同过滤之k近邻

    主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...

  8. asp.net网站项目调用page,或者ashx页面不能用反射

    public class TestHandler : System.Web.IHttpHandler { public bool IsReusable { get { return false; } ...

  9. zookeeperclient代码解读

    近期一直在忙WebPageTest(下面简称wpt)开源库的改动工作,当中一项工作须要将zookeeper(下面简称zk)集成到wpt里. zk作为分布式系统的同步工具.实现了写的原子性(要么失败.要 ...

  10. Succession

    Description The king in Utopia has died without an heir. Now several nobles in the country claim the ...