离散 单射 满射 双射

离散 单射 满射 双射单射双射满射阐述一下什么是单射,双射,满射1.单射:对于每一个不同的x都有不同的y,即x1!=x2–>y1!+y2条件:|X|<=|Y|2.满射:对于每一个y都有x与之对应条件:|Y|<=|X|3.双射:既是单射又是满射条件:|X|=|Y|代码实现通过map函数建立映射1.单射:map<int,int>BuildInjection(vector<int>src,vector<int>dst){map&l

大家好,又见面了,我是你们的朋友全栈君。

单射 双射 满射

阐述一下什么是单射,双射,满射
1.单射: 对于每一个不同的x都有不同的y,即 x1!=x2–>y1!+y2
条件:|X|<=|Y|
2.满射:对于每一个y都有x与之对应
条件:|Y|<=|X|
3.双射:既是单射又是满射
条件:|X|=|Y|

代码实现

通过map函数建立映射
1.单射:

map<int, int> BuildInjection(vector<int> src, vector<int> dst)
{ 
   
    map<int, int> injection;
    for (int i = 0; i < src.size(); ++i) { 
   
        injection[src[i]]=dst[i];
    }
    return injection;
}

因为是单射,所以|X|<|Y|,我们通过map函数建立键值对,来实现函数中的映射关系,所以我们形成映射的时候,只需要对于每一个X都有不同的Y即可,所以我们通过for循环,因为X<Y,所以取X的size(),为临界点,插入键值对。
2.满射:

map<int, int> BuildSurjection(vector<int> src, vector<int> dst)
{ 
   
    map<int, int> surjection;
    for (int i = 0; i < dst.size(); ++i) { 
   
        surjection[src[i]]=dst[i];
    }
    return surjection;
}

同理,通过src作为临界点进行便利
3.双射:

map<int, int> BuildBijection(vector<int> src, vector<int> dst)
{ 
   
    map<int, int> bijection;
    vector<int>::iterator iter;
    vector<int>::iterator iter1;
    for(iter=src.begin(),iter1=dst.begin();iter!=src.end()&&iter1!=dst.end();iter++,iter1++){ 
   
        bijection[*iter]=*iter1;
    }
    return bijection;
}

双射就是一 一对应,每一个都不能有重复,所以通过迭代器的++来输入不同的键值对。

判断是否是单射,满射,双射

1.验证单射:

bool ValidateInjection(vector<int> src, vector<int> dst, map<int, int> injection)
{ 
   
    bool bIsInjection = false;
    int size1=0;
    set<int> s;
    map<int ,int>::iterator iter;
    for (iter=injection.begin();iter!=injection.end();iter++,size1++) { 
   
        s.insert(iter->second);
    }
    if(size1==s.size()) bIsInjection= true;
    return bIsInjection;
}

set函数,是一个集合,他的作用是对于插入的数据进行排序以及去重,所以我们把Y值插入到s中观察是否有相同的数据,只需要判断键值对的数量以及集合的长度是否相等即可
2.验证满射

bool ValidateSurjection(vector<int> src, vector<int> dst, map<int, int> surjection)
{ 
   
    bool bIsSurjection = false;
    //请把你的代码写在下方,请勿修改任何已有代码
    int temp=dst.size();
    set<int> s;
    map<int ,int>::iterator iter;
    for (iter=surjection.begin();iter!=surjection.end();iter++)
    { 
   
        temp--;
    }
    if(temp==0) bIsSurjection= true;
    //
    return bIsSurjection;
}

我们对键值对进行遍历,每次都把Y中的长度-1,直至遍历完成,如果长度为0,就是满射,如果不是就不是满射
3.验证双射:

bool ValidateBijection(vector<int> src, vector<int> dst, map<int, int> bijection)
{ 
   
    bool bBiSurjection = false;
    //请把你的代码写在下方,请勿修改任何已有代码
    int temp=dst.size();
    bBiSurjection= true;
    map<int,int>::iterator iter;
    for (int i = 0; i < src.size(); ++i) { 
   
        iter=bijection.find(src[i]);
        if(iter==bijection.end()){ 
   
            bBiSurjection= false;
        }
    }
    set<int> s;

    for (iter=bijection.begin();iter!=bijection.end();iter++) { 
   
        s.insert(iter->second);
    }
    if(temp!=s.size()){ 
   
        bBiSurjection = false;
    }
    //
    return bBiSurjection;
}

验证双射,双射一 一对应,我们遍历X,在map中寻找X的键值对,有键值对就证明是对的,一旦找到没有键值对的X,就不是双射。再遍历Y,看Y中是否有相同值,有就不是双射

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132811.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sae wpa3加密方式_WPA3:四大安全新特性技术分析

    sae wpa3加密方式_WPA3:四大安全新特性技术分析周一晚些时候,包括苹果、思科、英特尔、高通和微软等科技巨头在内的Wi-Fi联盟正式推出了新的Wi-Fi安全标准WPA3。这个标准将解决所有已知的、会影响重要标准的安全问题,同时还针对KRACK和DEAUTH等无线攻击给出缓解措施。WPA3为支持Wi-Fi的设备带来重要改进,旨在增强配置、加强身份验证和加密等问题。重要改进主要包括:防范暴力攻击、WAP3正向保密、加强公共和…

    2022年5月24日
    47
  • Linux系统定时任务「建议收藏」

    Linux系统定时任务定时任务CrondCrond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6linux操作系统之后,默认便会启动Crond任务调度服务。Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定…

    2022年4月16日
    43
  • 将十进制小数转化为二进制小数的方法[通俗易懂]

    将十进制小数转化为二进制小数的方法[通俗易懂]十进制小数→二进制小数:(1)把十进制小数乘以2,得到积,把积的整数部分提出;(2)再用所得积的小数部分乘以2,得到积,把积的整数部分提出;(3)重复步骤2;(4)乘以2过程中提出的各个整数部分组成转换后的二进制小数。权的确定规则:最先提出的整数是二进制小数的最高位。看个例子就明白le:37.8125(十进制)的运算分为整数部分和小数部分:  整数部分的结…

    2022年9月24日
    0
  • XGBoost使用教程(纯xgboost方法)一

    XGBoost使用教程(纯xgboost方法)一“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。”一、导入必要的工具包#导入必要的工具包importxgboostasxgb#计算分类正确率fromsklearn.metricsimportaccuracy_score二、数据读取XGBo…

    2022年4月29日
    193
  • c语言十进制小数转二进制代码_c语言十进制转换成二进制

    c语言十进制小数转二进制代码_c语言十进制转换成二进制十进制转二进制,整数部分采用除以二取余,小数部分采用乘以二取整。网上大多数转换都是针对整数的,这里写一个小数的做个纪念#include#includeintmain(){doublea=0.2784;inti=0;printf(“0.”);for(i=0;i<18;i++){if(a*2>1)

    2022年9月24日
    0
  • JavaMD5[通俗易懂]

    JavaMD5[通俗易懂]publicclassCalPrivateKey{publicstaticvoidmain(String[]args) {StringappKey=”cee56d5722ea3afbef390e4dd1beda77″;StringappSecret=”010b02dd9b580f116c5352c5ecb7ca92″;St

    2022年7月14日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号