Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定一个向量是否是另一个向量子集的有效方法?_C++_C++11_Vector - Fatal编程技术网

C++ 确定一个向量是否是另一个向量子集的有效方法?

C++ 确定一个向量是否是另一个向量子集的有效方法?,c++,c++11,vector,C++,C++11,Vector,给定两个排序向量,由0和某些已知“n”之间的唯一值组成。一个向量(set1)的大小总是大于候选向量set2的大小 查询:用于确定给定的set2是否是set1的子集 除了C++11中的以下实现之外,他们还有什么更好、更有效的方法来实现这一点吗 #include <iostream> #include <vector> bool subSetCheck(std::vector<int> set1, std::vector<int> set2) {

给定两个排序向量,由0和某些已知“n”之间的唯一值组成。一个向量(set1)的大小总是大于候选向量set2的大小

查询:用于确定给定的set2是否是set1的子集

除了C++11中的以下实现之外,他们还有什么更好、更有效的方法来实现这一点吗

#include <iostream>
#include <vector>


bool subSetCheck(std::vector<int> set1, std::vector<int> set2) {

    //Set1 & 2 are always sorted and contain only unique integers from 0 to some known 'n'
    //Set1 is always larger than Set2 in size

    std::vector<int>::iterator it1 = set1.begin();
    std::vector<int>::iterator it2 = set2.begin();
    bool subSet = true;
    for (; (it1 != set1.end()) && (it2 !=set2.end()) ;) {

        if ( *it1 == *it2) {++it1; ++it2;}
        else if( *it1 > *it2) ++it2;
        else ++it1;
    }

    if (it1 ==set1.end()) subSet = false;

    return subSet;
}

int main () {

    std::vector<int> set1{0,1,2,3,4};
    std::vector<int> set2{0,1,5};

    if (subSetCheck(set1,set2)) std::cout << "Yes, set2 is subset of set1." << std::endl;
    else std::cout << "No! set2 is not a subset of set1." << std::endl;

    return 0;
}
#包括
#包括
布尔子切块(标准::向量集1,标准::向量集2){
//集合1和集合2总是被排序的,并且只包含从0到某些已知“n”的唯一整数
//Set1的大小始终大于Set2
std::vector::iterator it1=set1.begin();
std::vector::iterator it2=set2.begin();
布尔子集=真;
对于(;(it1!=set1.end())&&(it2!=set2.end());){
如果(*it1==*it2){++it1;++it2;}
否则,如果(*it1>*it2)++it2;
else++it1;
}
如果(it1==set1.end())子集=false;
返回子集;
}
int main(){
std::向量集1{0,1,2,3,4};
std::向量集2{0,1,5};

如果(子切块(set1,set2))std::cout您可以使用
std::includes

std::vector<int> a{1,2,3,4,5};
std::vector<int> b{1,2,6};
std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end()) << std::endl;
std::向量a{1,2,3,4,5};
std::向量b{1,2,6};

std::cout您可以使用
std::includes

std::vector<int> a{1,2,3,4,5};
std::vector<int> b{1,2,6};
std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end()) << std::endl;
std::向量a{1,2,3,4,5};
std::向量b{1,2,6};

std::cout是的,有更有效的方法。你问题的答案取决于你是否假设在大多数情况下,向量将是一个子集,或者不是

这都是假设没有重复的元素

让我们这样看,如果vec2恰好是vec1的子集,那么验证它需要O(vec1.size()),因为您必须查看每个元素

在这种情况下,您的实现已经非常接近最优。您可以通过使用二进制搜索来查找vec1中的第一个匹配元素,而不是像现在这样使用线性搜索来进行改进

一旦找到了元素,除了遍历所有元素并进行比较之外,您真的没有什么可以做的了

另一方面,如果您假定set2在大多数情况下不是set1的susbet,则应采用不同的方法

开头是一样的:使用二进制搜索在set1中查找set2的第一个元素

然后,使用二进制搜索查找set1中set2的最后一个元素

然后,检查跨度的大小是否与set2的大小匹配。如果不匹配,您可以立即退出

最后,如果大小匹配,则逐个元素进行比较


如果你有重复的元素,事情会变得更加棘手,而如何准确地做到这一点则留给读者作为练习。

是的,有更有效的方法。你的问题的答案取决于你是否假设在大多数情况下,向量将是子集

这都是假设没有重复的元素

让我们这样看,如果vec2恰好是vec1的子集,那么验证它需要O(vec1.size()),因为您必须查看每个元素

在这种情况下,您的实现已经非常接近最优。您可以通过使用二进制搜索来查找vec1中的第一个匹配元素,而不是像现在这样使用线性搜索来进行改进

一旦找到了元素,除了遍历所有元素并进行比较之外,您真的没有什么可以做的了

另一方面,如果您假定set2在大多数情况下不是set1的susbet,则应采用不同的方法

开头是一样的:使用二进制搜索在set1中查找set2的第一个元素

然后,使用二进制搜索查找set1中set2的最后一个元素

然后,检查跨度的大小是否与set2的大小匹配。如果不匹配,您可以立即退出

最后,如果大小匹配,则逐个元素进行比较


如果你有重复的元素,事情会变得更加棘手,而如何准确地做到这一点则留给读者作为练习。

std::includes你是在要求一种有效的方法来完成它,还是要求一种有效的方法从头开始实现它?如果是第一种,使用std算法如果是第二种,请查看std算法;)std::includes您是在要求一种高效的方法来完成它,还是要求一种从头开始实现它的高效方法?如果是第一种,请使用std算法如果是第二种,请查看std算法;)