L2_005集合相似度(set)

  • 之前用calculate的时候超时了,我觉得是因为复制操作太多,以及插入删除操作也很多,导致很耗时,而相比之下用平衡二叉树来实现的set,find操作是对数复杂度的,所以calculate2的方法通过循环s2在是中find然后更改相同元素和总非相同元素的计数更快

#include 
#include 
#include 
using namespace std;
double calculate(set s1,set s2)
{
    set ts=s1;
    int num=s1.size();
    for(set::iterator i=s2.begin();i!=s2.end();++i){//迭代器不支持小于号
        ts.insert(*i);
        s1.erase(*i);
    }
    double sum=ts.size();
    double same=num-s1.size();
    return same*1.0/sum;
}
double calculate2(set &s1,set &s2)
{
    double same=0;
    double sum=s1.size();
    for(set::iterator i=s2.begin();i!=s2.end();++i){
        if(s1.find(*i)!=s1.end())
            ++same;
        else
            ++sum;
    }
    return same*1.0/sum;
}
set* setp[51];//存指向集合的指针下标从1开始
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;++i){
        int num;cin>>num;
        setp[i]=new set();
        int x;
        for(int j=1;j<=num;++j){
            cin>>x;
            (*(setp[i])).insert(x);
        }
        //一开始携程set s s.insert setp[i]=&s输出来就很奇怪
    }
    int opn;cin>>opn;
    for(int i=0;i>n1>>n2;
        cout<

你可能感兴趣的:(L2_005集合相似度(set))