给定不同长度的序列,找到每个序列共有的最大数字序列

时间:2017-04-25 07:52:24

标签: c++ algorithm

我遇到了一些问题,我已经尝试了很多想法,但找不到最佳解决方案。

问题在于:

给定n个序列的序列,所有n个序列都按递增顺序排序但长度不同,找到每个序列共有的最大子序列。

例如,假设有3个序列A,B和C,

其中

A = {1 3 5 7 9 10 11 15 30 43 44 45 50}
B = {1 2 3 7 8 10 11 12 23 27 30 38 40 41 45 50 51 53 }
C = {0 1 3 7 9 11 12 13 14 19 20 24 28 30  50 51 61 90 99}

因此,所有这些的最大公共子序列是:

Answer = {1 3 7 11 30 50}

上面的例子说明了我想传达的想法。我怎样才能找到这样一个最大的共同子序列,它们都在递增中?

感谢您花时间和考虑阅读这篇文章。如果你能提供建议,我将非常感激。

1 个答案:

答案 0 :(得分:5)

简单解决方案:您可以合并所有集合(线性复杂度),然后计算在最终集合中出现n次的数字(再次线性复杂度)。

使用std :: multiset(具有重复项)和merge in algorithm

尝试here

#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    // your code goes here
    std::multiset<int> a {1,2,3};
    std::multiset<int> b {1,2,3};

    std::multiset<int> result;
    merge( a.begin(), a.end(), b.begin(), b.end(),  
    std::inserter(result, result.begin()));
    std::cout<<result.size()<<std::endl;
    return 0;
}

结果:

  

成功时间:0记忆:16064信号:0

     

6

set-union语义扩展到multiset(如所讨论的here),但不是我总是在他们would中进行的方式。

  

应该采用两个多重集合的联合运算   区别于合并两套的操作。想象一下   参数集包含元素7的三个实例,第二个   set包含两个具有相同值的实例。工会将包含   只有三个这样的值,而合并将包含五个。

从标准,25.3.5:

  

通过定义union()以包含最大数量的set,将set操作的语义以标准方式推广到多个集合。   每个元素的出现,intersection()包含最小值,   等等。