[英]Are all elements of `x` present in `y` (sorted vectors)?
Let x
and y
be two sorted vectors. 令x
和y
为两个排序的向量。 I would like to figure out which of the three is correct 我想找出三个中的哪一个是正确的
A. All elements of `y` are present in `x`
B. Some but not all elements of `y` are present in `x`
C. No element of `y` is present in `x`
U. Undefined (because `y` is empty)
A naive way to achieve this is with 天真的方法是
template<typename T>
char f(std::vector<T> x, std::vector<T> y)
{
if (y.size() == 0)
{
return 'U';
}
bool whereAnyElementFound = false;
bool whereAnyElementNotFound = false;
for (T& y_element : y)
{
bool isElementFound = std::find(x.begin(),x.end(),y_element) != x.end();
if (isElementFound)
{
whereAnyElementFound = true;
if (whereAnyElementNotFound)
{
return 'B';
}
} else
{
whereAnyElementNotFound = true;
if (whereAnyElementFound)
{
return 'B';
}
}
}
if (whereAnyElementFound)
{
return 'A';
} else if (whereAnyElementNotFound)
{
return 'C';
}
abort();
}
The function correctly match the following inputs to outputs 该功能将以下输入正确匹配到输出
inputs: x = {1,2,4,5} y = {2,5}
output: A
inputs: x = {1,2,4,5} y = {2,7}
output: B
inputs: x = {1,2,4,5} y = {6,7}
output: C
inputs: x = {1,2,4,5} y = {}
output: U
However, this method does not take advantage of the fact that both vectors are sorted. 但是,该方法没有利用两个向量都已排序的事实。 How can this function made faster for larger vectors? 对于较大的向量,如何使此函数更快?
For the cost of O(N)
additional space you can use std::set_intersection
. 对于O(N)
额外空间,您可以使用std::set_intersection
。 It has O(2(N1+N2-1))
complexity and generates a "set" of all the common elements between the two vectors. 它具有O(2(N1+N2-1))
复杂度,并生成两个向量之间所有公共元素的“集合”。 You can then check that new "set"'s size to figure out A, B, C and U. 然后,您可以检查新“集合”的大小以找出A,B,C和U。
int main()
{
std::vector<int> v1{1,2,3,4,5,6,7,8};
std::vector<int> v2{5,7,9,10};
std::vector<int> intersection;
std::set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(intersection));
if (intersection.size() == v2.size() && v2.size() > 0)
std::cout << "A";
else if (intersection.size() > 0)
std::cout << "B";
else if (intersection.size() == 0 && v2.size() > 0)
std::cout << "C";
else
std::cout << "U";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.