C++ merge 和 inplace_merge 的区别

9 篇文章 0 订阅
2 篇文章 0 订阅

C++ merge 和 inplace_merge 的区别

参考:
http://stackoverflow.com/questions/21624268/difference-between-stdmerge-and-stdinplace-merge
http://www.cplusplus.com/reference/algorithm/merge/
http://www.cplusplus.com/reference/algorithm/inplace_merge/
http://blog.csdn.net/ruan875417/article/details/46004869

首先这两个包含在 algorithm 头文件里面,

要求需要归并的内容必须是有序的,
merge:从两个的有序列(两个有序列可以在同一容器内)归并第三个容器.
inplace_merge:一个容器内分两个有序的部分归并到本身的容器.

图片截至:
http://stackoverflow.com/questions/21624268/difference-between-stdmerge-and-stdinplace-merge
复杂度

根据上面图片所说的,
merge 至多做 两段有序列长度之和 - 1 次对比,
inplace_merge在额外内存足够的情况下,恰好做 N - 1 次对比(N其实就是两段有序列长度之和 ),否则(没有足够内存用来缓存)复杂度就是 N*log(N),即若尝试分配缓存失败就会用比较低效的算法来执行.

总结

假设M,N分别为两段有序列的长度.

merge时间复杂度为O(min(M,N)),空间复杂度O(M+N).

inplace_merge,在分配缓存成功时,时间复杂度O(M+N),空间复杂度看分配的缓存,即可能为O(M),O(N)或O(M+N),否则,时间复杂度为O(N*log(N)),空间复杂度为O(1).


merge

函数定义如下:

default (1) 
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result);
custom (2)  
template <class InputIterator1, class InputIterator2,
          class OutputIterator, class Compare>
  OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result, Compare comp);

可以看出是由两个容器归并到第三个容器里,第三个容器不可以是前两个容器任何一个.

    vector<int> vec1 = { 5,10,15,20,25 };
    vector<int> vec2 = { 0,10,10,25,30 };
    vector<int> vec3(vec1.size()+vec2.size());

    //vec1,vec2归并到vec3,如下
    merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin());
    //vec3:{0,5,10,10,10,15,20,25,25,30}

    //两个容器可以指向同一个容器,如下
    vector<int> vec4 = { 5,10,15,20,25 ,0,10,10,25,30 };
    merge(vec4.begin(), vec4.begin() + 5, vec4.begin() + 5, vec4.end(), vec3.begin());
    //vec3:{0,5,10,10,10,15,20,25,25,30}

    //但指向同一个容器并不严谨,重叠时并不会报错,如下
    merge(vec1.begin(), vec1.end(), vec1.begin(), vec1.end(), vec3.begin());
    //vec3:{ 5,5,10,10,15,15,20,20,25,25 }




    //但第三个容器不可以是前两个容器任何一个,因为前两个正在读取,不能直接写入
    merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec1.begin());//错误的

inplace_merge

函数定义如下:

default (1) 
template <class BidirectionalIterator>
  void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                      BidirectionalIterator last);
custom (2)  
template <class BidirectionalIterator, class Compare>
  void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                      BidirectionalIterator last, Compare comp);

可以看出,归并的两个部分分别是first到middle,和middle到last.

    vector<int> vec1 = { 5,10,15,20,25 ,0,10,10,25,30 };

    inplace_merge(vec1.begin(), vec1.begin() + 5, vec1.end());
    //vec1:{0,5,10,10,10,15,20,25,25,30}

实际上inplace_merge有申请了额外的缓存区,所以可以直接归并到本身的容器里.可以参考这里

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在R语言中,`merge()`函数和`inner_join()`函数都可以用于合并(连接)两个数据框。它们的主要区别在于语法和执行方式。 `merge()`函数是R的基本函数,可以根据指定的键(或多个键)将两个数据框进行合并。它可以根据键的匹配方式,分为内连接、外连接、左连接和右连接等不同类型。在默认情况下,`merge()`函数执行内连接(inner join),即只保留两个数据框中键匹配的行。 以下是使用`merge()`函数进行内连接的示例: ```R merged_df <- merge(df1, df2, by = "key") ``` 其中,`df1`和`df2`是要合并的两个数据框,`by`参数指定了用于匹配的键。这将返回一个新的数据框`merged_df`,其中只包含`df1`和`df2`中键匹配的行。 而`inner_join()`函数则是dplyr包中提供的函数,它也执行内连接操作。相比于`merge()`函数,`inner_join()`函数提供了更简洁的语法,并且可以方便地与其他dplyr包中的函数进行链式操作。 以下是使用`inner_join()`函数进行内连接的示例: ```R library(dplyr) merged_df <- inner_join(df1, df2, by = "key") ``` 同样,`df1`和`df2`是要合并的两个数据框,`by`参数指定了用于匹配的键。这将返回一个新的数据框`merged_df`,其中只包含`df1`和`df2`中键匹配的行。 总结来说,`merge()`函数是R的基本函数,可以执行不同类型的连接操作,而`inner_join()`函数是dplyr包中提供的函数,用于执行内连接操作,并提供了更简洁的语法和链式操作的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值