C++不像python自带issubset方法,用来判断一个元素是否为另一个元素的子集,需要自己写一个,但是也不能对vector1的一个一个元素判断是否都属于vector2,这个子集最基本的定义去判断,这样做时间复杂度太大了,如果vector1的长度为m,vector2的长度为n,那么时间复杂度将去到O(m*n)之久,元素一多,这很致命,可以用如下的方式去判断vector是否为另一个vector的子集:
#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
bool isSubset(vector<int> v1, vector<int> v2){
int i=0,j=0;
int m=v1.size();
int n=v2.size();
if(m<n){
return 0;
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
while(i<n&&j<m){
if(v1[j]<v2[i]){
j++;
}
else if(v1[j]==v2[i]){
j++;
i++;
}
else if(v1[j]>v2[i]){
return 0;
}
}
if(i<n){
return 0;
}
else{
return 1;
}
}
int main(){
vector<int> v1,v2;
v1.push_back(3);v1.push_back(2);v1.push_back(1);
v2.push_back(1);v2.push_back(2);
cout<<isSubset(v1,v2)<<endl;
vector<int> v3,v4;
v3.push_back(3);v3.push_back(1);v3.push_back(2);
v4.push_back(1);v4.push_back(4);v4.push_back(4);
cout<<isSubset(v3,v4)<<endl;
vector<int> v5,v6;
v5.push_back(3);v5.push_back(1);v5.push_back(2);v5.push_back(3);
v6.push_back(1);v6.push_back(2);
cout<<isSubset(v5,v6)<<endl;
return 0;
}
程序设置判断v2={1,2}是否为v1={3,2,1}的子集、v4={1,4,4}是否为v3={3,1,2}的子集、v6={1,2}是否为v5={3,1,2,3}的子集三个实例去测试,运行结果如下:
算法的基本思想如下,先对两个数组用自带的sort方法进行一个快速排序。再用两个游标i,j同时游走去判断,分如下情况:
通过这个的排序,判断vector是否为另一个vector的子集能够迅速完成,最后的时间复杂度仅为O(mLogm+nLogn),线性对数阶至少比平方阶少一级。时间主要花在快速排序的线性对数阶上面了。