对c ++传染媒介的交叉点

时间:2016-03-27 00:14:36

标签: c++ c++11 vector

我有以下向量:

 vector<unsigned> A,B1;
 vector<pair<unsigned,unsigned> > B2;

我想执行(A,B1)(A,B2)的交集。我想然后执行两个交叉结果的并集。向量AB1包含有序无符号整数,向量B2包含(start,end)个值对。示例向量AB2及其交叉向量如下所示:

   vector<unsigned> A(2,4,6,8,9,10,34,74,79,81,89,91,95);
   vector<pair<unsigned,unsigned> > B2={ {2, 3}, {29, 40}, {60, 85} };
   vector<unsigned> intersection; //result of intersection of A and B2 -> Procedure of performing intersection is explained below
   //intersection=(2,34,74,79,81);

2位于交叉点,2位于{2,3}。同样,34位于交叉点,34位于{29,40}之间。同样地,747981处于交叉点,因为它们位于B2的最后一个元素{60,85}的范围内。

是否有一些有效的方法可以获得与以下相同的结果:

(1)。交叉点AB1; (2)。 AB2的交集; (3)。在步骤1和2中执行的两个交叉点的并集(即交叉点(A,B1)(A,B2)

1 个答案:

答案 0 :(得分:1)

更新

在重新阅读问题之后,我意识到你可能想要在一个中完成所有三个操作。

我们可以将外部循环的迭代次数减少到一次,并通过将三个函数组合成一个并返回一个元组来删除一个内部循环:

egen pair = group(rater ratee)
bysort pair (date): timesRated = _n

预期结果:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <tuple>


std::tuple<std::vector<unsigned>, std::vector<unsigned>, std::vector<unsigned>>
find_everything(const std::vector<unsigned>& a,
                const std::vector<std::pair<unsigned,unsigned> >& b1,
                const std::vector<std::pair<unsigned,unsigned> >& b2)
{
    std::vector<unsigned> r1, r2, both;

    for (auto x : a)
    {
        auto either = false;
        auto i = std::find_if(std::begin(b1),
                              std::end(b1),
                              [x](const auto& range)
                              { return x >= range.first && x < range.second; });
        if (i != std::end(b1)) {
            either = true;
            r1.push_back(x);
        }

        i = std::find_if(std::begin(b2),
                              std::end(b2),
                              [x](const auto& range)
                              { return x >= range.first && x < range.second; });
        if (i != std::end(b2)) {
            either = true;
            r2.push_back(x);
        }

        if (either) {
            both.push_back(x);
        }
    }
    return std::make_tuple(std::move(r1), std::move(r2), std::move(both));
}



int main()
{

    using namespace std;

    vector<unsigned> A { 2,4,6,8,9,10,34,74,79,81,89,91,95 };
    vector<pair<unsigned,unsigned> > B1={ {4, 5}, {8, 10}, {90, 99} };
    vector<pair<unsigned,unsigned> > B2={ {2, 3}, {29, 40}, {60, 85} };

    auto results = find_everything(A, B1, B2);
    const auto& r1 = std::get<0>(results);
    const auto& r2 = std::get<1>(results);
    const auto& both = std::get<2>(results);
    copy(begin(r1), end(r1), ostream_iterator<unsigned>(cout, ", "));
    cout << endl;

    copy(begin(r2), end(r2), ostream_iterator<unsigned>(cout, ", "));
    cout << endl;

    copy(begin(both), end(both), ostream_iterator<unsigned>(cout, ", "));
    cout << endl;

    return 0;
}

进一步的工作:

如果数据集很大,我们可以做出两项明显的改进:

  1. 由于A,B1和B2已排序,我们可以跟踪“当前”匹配迭代器,减少每个匹配或不匹配的搜索空间(这开始争论4, 8, 9, 91, 95, 2, 34, 74, 79, 81, 2, 4, 8, 9, 34, 74, 79, 81, 91, 95,

  2. 或者如果A明显大于B1和B2,我们可以将搜索并行化。

  3. 玩得开心:)