- ベクトルをソート。
std::set_intersection()
を3回(あなたが持っているベクトルの数が1になります)使用してください。
時間複雑度の分析:2 *(firstSize + secondSize)で
- 4 * O(nlogn)= O(nlogn)
- リニア - 1つの
- 線形2 *(firstSecondInterSize + thirdSize) - 1
- 2 *(firstSecondThirdInterSize + fourthSize) - 1
は、O(nlogn)で囲まれています。ソートはアルゴリズムのボトルネックです。
完全なコード例:
#include <iostream> // std::cout
#include <algorithm> // std::set_intersection, std::sort
#include <vector> // std::vector
int main() {
std::vector<int> first = {5,10,15,20,25};
std::vector<int> second = {50,40,30,20,10};
std::vector<int> third = {10,20,3,4,0};
std::vector<int> fourth = {4,20,10,3,6};
std::vector<int> v(first.size() + second.size() + third.size() + fourth.size());
std::vector<int>::iterator it;
std::sort (first.begin(),first.end());
std::sort (second.begin(),second.end());
std::sort (third.begin(),third.end());
std::sort (fourth.begin(),fourth.end());
it=std::set_intersection (first.begin(), first.end(), second.begin(), second.end(), v.begin());
it=std::set_intersection (v.begin(), v.end(), third.begin(), third.end(), v.begin());
it=std::set_intersection (v.begin(), v.end(), fourth.begin(), fourth.end(), v.begin());
v.resize(it-v.begin());
std::cout << "The intersection has " << (v.size()) << " elements: ";
for (it=v.begin(); it!=v.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
出力:
交点が2つの要素があります:10 20
おそらくに見えるを[ 'のstd :: set_intersection'] (http://en.cppreference.com/w/cpp/algorithm/set_intersection) – Mark
2つ以上あるので[this](https: //stackoverflow.com/questions/12875993/efficient-set-intersection-of-a-collection-of-sets-in-c)おそらくより適切です。 – Mark