You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于判断单射(injective)函数的Python代码的原理及正确性疑问

关于判断单射(injective)函数的Python代码的原理及正确性疑问

嘿,我来帮你把这段代码和单射函数的数学定义对应起来,你一看就懂啦~

首先咱们先明确单射(one-to-one)函数的核心数学定义:对于函数f: X→Y,只要定义域X里的两个元素x₁≠x₂,那它们映射到陪域Y的结果一定满足f(x₁)≠f(x₂)。换句话说,值域里的每个元素,都只能被定义域里的唯一一个元素“对应”过来,绝对不会出现“多个定义域元素共享同一个值域元素”的情况。

再看你用的这段Python代码,它是用字典来表示函数的:

  • 字典的就是定义域X中的元素(比如示例里的"A"、"B"、"C"),字典不允许重复键,所以len(function)就是定义域X里元素的总个数。
  • 字典的就是这个函数映射到陪域Y的结果,这些值的全体其实是函数的值域(值域是陪域的子集,陪域是你定义的[1,2,3,4],但值域实际是映射到的那些值,比如示例里的{1,2,4})。

现在拆解is_injective函数的逻辑:

  1. codomain_set = set(function.values()):把字典的值转成集合,集合的核心特性就是自动去重——如果有多个定义域元素映射到了同一个值,集合里只会保留一个副本。比如如果你的函数是{"A":1, "B":1, "C":4},转成集合后就变成了{1,4},重复的1被去掉了。
  2. 比较len(codomain_set) == len(function)
    • 如果两者相等:说明值域里的不同元素个数,和定义域里的元素个数完全一样。这就意味着没有任何重复的映射结果——每个值域元素都只对应一个定义域元素,完美贴合单射的定义!
    • 如果两者不相等:说明集合去重后长度变小了,也就是存在至少两个不同的定义域元素映射到了同一个值,这显然违反了单射的要求。

举个直观的例子:

  • 你的示例函数:{"A":1, "B":2, "C":4}function.values()[1,2,4],转成集合后长度还是3,和len(function)(3)相等,所以是单射。
  • 要是改成{"A":1, "B":1, "C":4}function.values()转成集合后长度是2,小于len(function)(3),返回False,确实不是单射。

所以这段代码的逻辑完全是把单射的数学定义,转化成了Python里可执行的集合去重+长度比较,是完全正确的哦~

备注:内容来源于stack exchange,提问作者Robin Andrews

火山引擎 最新活动