离散题目9--判断单射

离散题目9

Time Limit: 1000MS  Memory Limit: 65536KB
Problem Description

给定一个数学函数F和两个集合A,B,写一个程序来确定函数是单射。

即A中的任意一个元素唯一的对应一个函数值,并且该值为B集合中的某个元素。

Input

多组输入。     

首先输入集合的元素数n<=100000。     

接下来的一行输入n 个整数0<=ai<=n。     

接下来的一行输入n个整数 0<=bi<=n。     

接下来的一行输入2n个整数ci,并且当ci的下标为奇数时表示A集合中的元素,当ci的下标为偶数时表示A集合中元素对应的函数值(即B集合的元素)。

Output

(一组答案占一行)   

当满足单射关系时输出yes     

不满足关系时输出no

Example Input
4
1 3 5 7
2 5 6 8
1 2 3 2 5 8 7 6
2
1 4
3 5
1 3 1 5
Example Output
yes
no
注意奇偶数下表代表的不同
代码:
#include <bits/stdc++.h>
using namespace std;
int s[100050];
int t[100050];
int main()
{
    int n, x, i;
    while(~scanf("%d", &n))
    {
        memset(s, 0, sizeof(s));
        memset(t, 0, sizeof(t));
        for(i=0; i<n; i++)
        {
            scanf("%d", &x);
            s[x] = 1;
        }
        for(i=0; i<n; i++)
        {
            scanf("%d", &x);
            t[x] = 1;
        }
        int flag = 1;
        for(i=0; i<2*n; i++)
        {
            scanf("%d", &x);
            if(i%2==0)
            {
                if(s[x]==1)
                {
                    s[x] = 0;
                }
                else
                {
                    flag = 0;
                    s[x] = 2;
                }
            }
            else
            {
                if(t[x]!=1)
                {
                    flag = 0;
                }
            }
        }
        if(flag)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}







### 单射与满射的定义 #### 单射 (Injection) 单射是指对于任意两个不同的输入 \(a\) 和 \(b\),它们对应的输出也不同。换句话说,在函数 \(f : A \to B\) 中,如果满足条件: \[ \forall a_1, a_2 \in A,\ f(a_1) = f(a_2) \implies a_1 = a_2, \] 则该函数被称为单射[^1]。 #### 满射 (Surjection) 满射是指目标集合 \(B\) 的每一个元素都至少有一个来自源集合 \(A\) 的元素与其相对应。也就是说,在函数 \(f : A \to B\) 中,如果满足条件: \[ \forall b \in B,\ \exists a \in A \text{ such that } f(a) = b, \] 则该函数被称为满射[^3]。 --- ### 单射与满射的区别 | **特性** | **单射** | **满射** | |----------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | 定义 | 输入的不同导致输出的不同 | 输出覆盖整个目标集合 | | 数学表达 | 如果 \(f(x_1) = f(x_2)\),那么必有 \(x_1 = x_2\) | 对于任何 \(y \in B\),存在某个 \(x \in A\) 使得 \(f(x) = y\) | | 集合间关系 | 不允许重复映射 | 要求每个目标都有原像 | --- ### 示例分析 #### 单射示例 考虑函数 \(f: \mathbb{Z} \to \mathbb{Z}\),其中 \(f(x) = 2x\)。因为当 \(x_1 \neq x_2\) 时,\(f(x_1) \neq f(x_2)\),所以这是一个单射。 ```python def is_injective(f_values): return len(set(f_values)) == len(f_values) # 测试数据 input_data = [1, 2, 3] output_data = list(map(lambda x: 2 * x, input_data)) print(is_injective(output_data)) # True 表明这是单射 ``` #### 满射示例 考虑函数 \(g: \mathbb{N} \to \mathbb{N}\),其中 \(g(x) = x - 1\) (假自然数从零开始)。由于每个自然数都可以通过加一得到其前驱,因此这是一个满射。 ```python def is_surjective(domain, codomain, g_func): image_set = set(g_func(x) for x in domain) return image_set == set(codomain) # 测试数据 domain = range(5) # {0, 1, 2, 3, 4} codomain = range(-1, 4) # {-1, 0, 1, 2, 3} g_func = lambda x: x - 1 print(is_surjective(domain, codomain, g_func)) # True 表明这是满射 ``` --- ### 结论 单射强调的是“一对一”的映射关系;而满射关注的是目标集合中的所有元素都被映射到。两者的核心区别在于前者不允许重复映射,后者要求完全覆盖目标集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值