【C++】判断vector是否为另一个vector的子集

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),线性对数阶至少比平方阶少一级。时间主要花在快速排序的线性对数阶上面了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值