PAT-A 1063. Set Similarity (25)

本文介绍了一道关于STL set的练习题,探讨了如何高效地计算两个集合的交集与并集,最终实现了一个O(NlogN)时间复杂度的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道STL(set)的练习题。

set翻译为集合,是一个内部自动有序不含重复元素的容器,这是set非常重要的特性,要在实际问题中充分利用之。

除此之外,值得注意的是,set的基本操作:insert()、find()等一些操作的时间复杂度为O(logN)。


题目链接在此

题意

给出N个集合,然后有K个查询,给出每个查询的Set Similarity,即(Nc/Nt)*100.0。Nc为两个集合的交集的元素个数,Nt为两个集合的并集的元素个数。

思路及实现

刚开始有两种想法:

  1. 想法一:对于交集,自己实现一个求交集的函数,时间复杂度到了O(N^2);对于并集,则利用set的特性,将两个集合放到一个set中,即可得到并集。
  2. 想法二:直接利用< algorithm >头文件中的set_union()、set_intersection()求得并集和交集

实践证明,以上两种方法都会有一组测试点超时。

那么如何降低求交集和并集的时间复杂度呢?想想上面提到的set的find()操作,它的时间复杂度达到了O(logN)。

以下是程序的正确思路,时间复杂度为O(NlogN):

  1. 用一个set数组sets保存所有输入的集合
  2. 要查询的两个集合分别为sets[a]、sets[b]
  3. 初始化Nc=0, Nt=sets[b].size()(集合b的元素个数)
  4. 然后一边遍历集合a,一边用find()操作在集合b中查找是否在b中也存在某元素,若存在,则Nc++,若不存在,则Nt++。最后即可求得所求比值。
#include<stdio.h>
#include<set>
#include<algorithm>

using namespace std;

const int N = 51;
set<int> sets[N];

void getNcAndNt(int a, int b, int &nc, int &nt){  //求集合a与集合b的nc和nt 
    for(set<int>::iterator ita = sets[a-1].begin(); ita != sets[a-1].end(); ita++){
        if(sets[b-1].find(*ita) != sets[b-1].end()){   //在b集合中能找到该元素 
            nc++;
        }else{          //在b集合中不能找到该元素 
            nt++;
        }
    }
}

int main(){

    int n;   // total number of set
    scanf("%d",&n);

    for(int i = 0; i < n; i++){     //get sets
        int num;
        scanf("%d", &num);

        for(int j = 0; j < num; j++){
            int temp;
            scanf("%d", &temp);
            sets[i].insert(temp);
        }
    } 

    //获取查询并求并集和交集个数
    int query;
    scanf("%d", &query);
    for(int i = 0; i < query; i++){
        int a,b;
        scanf("%d %d",&a, &b);

        int nc = 0,nt = sets[b-1].size();  //交集个数,并集个数  
        getNcAndNt(a, b, nc, nt);

        printf("%.1lf%%\n", nc*100.0/nt);
    } 


    return 0;
} 
root@autodl-container-8bf9409db0-3243e00c:~/autodl-tmp# python utils_one.py /root/autodl-tmp/utils_one.py:134: SyntaxWarning: invalid escape sequence '\_' """ 设备信息: { "device": "cuda", "gpu_available": true, "gpu_name": "NVIDIA H20", "total_memory": "102.11 GB", "used_memory": "0.47 GB" } 开始对话评估... 测试 1/5434 - 得分: 0.2356 - ✗ 测试 2/5434 - 得分: 0.2356 - ✗ 测试 3/5434 - 得分: 0.2356 - ✗ 测试 4/5434 - 得分: 0.2356 - ✗ 测试 5/5434 - 得分: 0.2356 - ✗ 测试 6/5434 - 得分: 0.2356 - ✗ 测试 7/5434 - 得分: 0.2356 - ✗ 测试 8/5434 - 得分: 0.2356 - ✗ 测试 9/5434 - 得分: 0.2356 - ✗ 测试 10/5434 - 得分: 0.2356 - ✗ 测试 11/5434 - 得分: 0.2356 - ✗ 测试 12/5434 - 得分: 0.2356 - ✗ 测试 13/5434 - 得分: 0.2356 - ✗ 测试 14/5434 - 得分: 0.2356 - ✗ 测试 15/5434 - 得分: 0.2356 - ✗ 测试 16/5434 - 得分: 0.2356 - ✗ 测试 17/5434 - 得分: 0.2356 - ✗ 测试 18/5434 - 得分: 0.2356 - ✗ 测试 19/5434 - 得分: 0.2356 - ✗ 测试 20/5434 - 得分: 0.2356 - ✗ 测试 21/5434 - 得分: 0.2356 - ✗ 测试 22/5434 - 得分: 0.2356 - ✗ 测试 23/5434 - 得分: 0.2356 - ✗ 测试 24/5434 - 得分: 0.2356 - ✗ 测试 25/5434 - 得分: 0.2356 - ✗ 测试 26/5434 - 得分: 0.2356 - ✗ 测试 27/5434 - 得分: 0.2356 - ✗ 测试 28/5434 - 得分: 0.2356 - ✗ 测试 29/5434 - 得分: 0.2356 - ✗ 测试 30/5434 - 得分: 0.2356 - ✗ 测试 31/5434 - 得分: 0.2356 - ✗ 测试 32/5434 - 得分: 0.2356 - ✗ 测试 33/5434 - 得分: 0.2356 - ✗ 测试 34/5434 - 得分: 0.2356 - ✗ 测试 35/5434 - 得分: 0.2356 - ✗ 测试 36/5434 - 得分: 0.2356 - ✗ 测试 37/5434 - 得分: 0.2356 - ✗ 测试 38/5434 - 得分: 0.2356 - ✗ 测试 39/5434 - 得分: 0.2356 - ✗ 测试 40/5434 - 得分: 0.2356 - ✗ 测试 41/5434 - 得分: 0.2356 - ✗ 测试 42/5434 - 得分: 0.2356 - ✗ 测试 43/5434 - 得分: 0.2356 - ✗ 测试 44/5434 - 得分: 0.2356 - ✗ 测试 45/5434 - 得分: 0.2356 - ✗ 测试 46/5434 - 得分: 0.2356 - ✗ 测试 47/5434 - 得分: 0.2356 - ✗ 测试 48/5434 - 得分: 0.2356 - ✗ 测试 49/5434 - 得分: 0.2356 - ✗ 测试 50/5434 - 得分: 0.2356 - ✗ 测试 51/5434 - 得分: 0.2356 - ✗ 测试 52/5434 - 得分: 0.2356 - ✗ 测试 53/5434 - 得分: 0.2356 - ✗ 测试 54/5434 - 得分: 0.2356 - ✗ 测试 55/5434 - 得分: 0.2356 - ✗ 测试 56/5434 - 得分: 0.2356 - ✗ 测试 57/5434 - 得分: 0.2356 - ✗ 测试 58/5434 - 得分: 0.2356 - ✗ 测试 59/5434 - 得分: 0.2356 - ✗ 测试 60/5434 - 得分: 0.2356 - ✗ 测试 61/5434 - 得分: 0.2356 - ✗ 测试 62/5434 - 得分: 0.2356 - ✗ 测试 63/5434 - 得分: 0.2356 - ✗ 测试 64/5434 - 得分: 0.2356 - ✗ 测试 65/5434 - 得分: 0.2356 - ✗ 测试 66/5434 - 得分: 0.2356 - ✗ 测试 67/5434 - 得分: 0.2356 - ✗ 测试 68/5434 - 得分: 0.2356 - ✗ 测试 69/5434 - 得分: 0.2356 - ✗ 测试 70/5434 - 得分: 0.2356 - ✗ 测试 71/5434 - 得分: 0.2356 - ✗ 测试 72/5434 - 得分: 0.2356 - ✗ 测试 73/5434 - 得分: 0.2356 - ✗ 测试 74/5434 - 得分: 0.2356 - ✗ 测试 75/5434 - 得分: 0.2356 - ✗ 测试 76/5434 - 得分: 0.2356 - ✗ 测试 77/5434 - 得分: 0.2356 - ✗ 测试 78/5434 - 得分: 0.2356 - ✗ 测试 79/5434 - 得分: 0.2356 - ✗ 测试 80/5434 - 得分: 0.2356 - ✗ 测试 81/5434 - 得分: 0.2356 - ✗ 测试 82/5434 - 得分: 0.2356 - ✗ 测试 83/5434 - 得分: 0.2356 - ✗ 测试 84/5434 - 得分: 0.2356 - ✗ 测试 85/5434 - 得分: 0.2356 - ✗ 测试 86/5434 - 得分: 0.2356 - ✗ 测试 87/5434 - 得分: 0.2356 - ✗ 测试 88/5434 - 得分: 0.2356 - ✗ 测试 89/5434 - 得分: 0.2356 - ✗ 测试 90/5434 - 得分: 0.2356 - ✗ 测试 91/5434 - 得分: 0.2356 - ✗ 测试 92/5434 - 得分: 0.2356 - ✗ 测试 93/5434 - 得分: 0.2356 - ✗ 测试 94/5434 - 得分: 0.2356 - ✗ 测试 95/5434 - 得分: 0.2356 - ✗ 测试 96/5434 - 得分: 0.2356 - ✗ 测试 97/5434 - 得分: 0.2356 - ✗ 测试 98/5434 - 得分: 0.2356 - ✗ 测试 99/5434 - 得分: 0.2356 - ✗ 测试 100/5434 - 得分: 0.2356 - ✗ 测试 101/5434 - 得分: 0.2356 - ✗ 测试 102/5434 - 得分: 0.2356 - ✗ 测试 103/5434 - 得分: 0.2356 - ✗ 测试 104/5434 - 得分: 0.2356 - ✗ 测试 105/5434 - 得分: 0.2356 - ✗ 测试 106/5434 - 得分: 0.2356 - ✗ 测试 107/5434 - 得分: 0.2356 - ✗ 测试 108/5434 - 得分: 0.2356 - ✗ 测试 109/5434 - 得分: 0.2356 - ✗ 测试 110/5434 - 得分: 0.2356 - ✗ ^C测试 111/5434 - 得分: 0.2356 - ✗ Traceback (most recent call last): File "/root/autodl-tmp/utils_one.py", line 201, in <module> summary = evaluator.evaluate(output_path="dialogue_results.json") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/autodl-tmp/utils_one.py", line 172, in evaluate print(f"测试 {i+1}/{len(dialogues)} - 得分: {result.similarity_score:.4f} - {'✓' if result.is_correct else '✗'}")
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值