美文网首页
L2_005集合相似度(set)

L2_005集合相似度(set)

作者: 我好菜啊_ | 来源:发表于2018-03-23 21:37 被阅读0次
    • 之前用calculate的时候超时了,我觉得是因为复制操作太多,以及插入删除操作也很多,导致很耗时,而相比之下用平衡二叉树来实现的set,find操作是对数复杂度的,所以calculate2的方法通过循环s2在是中find然后更改相同元素和总非相同元素的计数更快

    #include <iostream>
    #include <set>
    #include <iomanip>
    using namespace std;
    double calculate(set<int> s1,set<int> s2)
    {
        set<int> ts=s1;
        int num=s1.size();
        for(set<int>::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<int> &s1,set<int> &s2)
    {
        double same=0;
        double sum=s1.size();
        for(set<int>::iterator i=s2.begin();i!=s2.end();++i){
            if(s1.find(*i)!=s1.end())
                ++same;
            else
                ++sum;
        }
        return same*1.0/sum;
    }
    set<int>* 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>();
            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<opn;++i){
            if(i)
               cout<<endl;
            int n1,n2;
            cin>>n1>>n2;
            cout<<setprecision(2)<<setiosflags(ios::fixed)<<calculate2(*(setp[n1]),*(setp[n2]))*100<<'%';
        }
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:L2_005集合相似度(set)

          本文链接:https://www.haomeiwen.com/subject/wykfcftx.html