A1063 Set Similarity(set基本用法)

博客主要围绕熟悉set的特性和用法展开,涉及insert、size、find等操作,同时提醒使用printf输出%时要输%%,属于信息技术中数据结构相关内容。

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

题目描述
在这里插入图片描述
这题主要是熟悉一下set的特性和用法(insert,size,find
要注意的一点是printf输出%时要输**%%**

#include<cstdio>
#include<set>
using namespace std;
const int N=51;
set<int> st[N];
void compare(int x,int y)
{
    int totalNum=st[y].size(),sameNum=0;//并集个数,交集个数
    for(set<int>::iterator it=st[x].begin();it!=st[x].end();it++){
        if(st[y].find(*it)!=st[y].end()) sameNum++;//st[y]中能找到该元素
        else totalNum++;////st[y]中不能找到该元素
    }
    printf("%.1f%%",sameNum*100.0/totalNum);
}

int main()
{
    int n,k,q,v,st1,st2;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&k);
        for(int j=0;j<k;j++){
            scanf("%d",&v);
            st[i].insert(v);
        }
    }
    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        scanf("%d%d",&st1,&st2);
        compare(st1,st2);
    }
    return 0;
}

import pandas as pd import numpy as np from itertools import combinations def jaccard_similarity(set1, set2): """计算Jaccard相似度系数""" intersection = len(set1 & set2) union = len(set1 | set2) return intersection / union if union != 0 else 0 def dice_similarity(set1, set2): """计算Dice相似度系数""" intersection = len(set1 & set2) return (2 * intersection) / (len(set1) + len(set2)) if (len(set1) + len(set2)) != 0 else 0 def overlap_similarity(set1, set2): """计算重叠相似度系数""" intersection = len(set1 & set2) min_size = min(len(set1), len(set2)) return intersection / min_size if min_size != 0 else 0 # 读取Excel文件 file_path = "sets_data.xlsx" # 替换为你的文件路径 df = pd.read_excel(file_path) # 检查数据格式并转换为集合 if not df.applymap(lambda x: isinstance(x, (int, float, bool))).all().all(): # 非二进制格式:每个单元格包含元素列表 sets = {col: set(df[col].dropna().astype(str).sum().split(';')) for col in df.columns} else: # 二进制格式:每行代表一个元素 sets = {} for col in df.columns: if df[col].dtype in [int, float, bool]: sets[col] = set(df.index[df[col].astype(bool)]) # 计算所有集合对的相似度 set_names = list(sets.keys()) similarity_matrix = pd.DataFrame( np.zeros((len(set_names), len(set_names))), index=set_names, columns=set_names ) for (name1, set1), (name2, set2) in combinations(sets.items(), 2): jaccard = jaccard_similarity(set1, set2) dice = dice_similarity(set1, set2) overlap = overlap_similarity(set1, set2) # 存储结果(矩阵对称) similarity_matrix.loc[name1, name2] = jaccard similarity_matrix.loc[name2, name1] = jaccard # 添加对角线(相同集合相似度为1) np.fill_diagonal(similarity_matrix.values, 1) # 保存结果 output_path = "similarity_matrix.xlsx" similarity_matrix.to_excel(output_path) print(f"相似度矩阵已保存至: {output_path}") # 打印示例结果 print("\n相似度矩阵示例:") print(similarity_matrix.head()) 上述代码获得的相似度系数要么为1要么为0,这是不正确的,请分析改正
最新发布
07-01
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值