frozenset等式是如何在Python中实现的?

frozenset等式是如何在Python中实现的?,python,cpython,frozenset,Python,Cpython,Frozenset,如何在CPython中实现frozenset平等?特别是,我想知道fronzenset中的各个元素是如何相互比较的,以及它们的总时间复杂度 我看了一眼,又看了一眼 第二个链接中的答案涵盖了比较集合中单个元素之前的步骤,但缺少实际的比较算法。可以找到有问题的实现。算法是这样的,假设我们想检查两个集合v和w是否相等: 检查它们的大小是否相等。如果不是,则返回false 这引用了PySetObject的size属性,因此它是一个常量时间操作 检查两个集合是否都是冻结集合。如果是,并且它们的哈希值不同,

如何在CPython中实现frozenset平等?特别是,我想知道fronzenset中的各个元素是如何相互比较的,以及它们的总时间复杂度

我看了一眼,又看了一眼


第二个链接中的答案涵盖了比较集合中单个元素之前的步骤,但缺少实际的比较算法。

可以找到有问题的实现。算法是这样的,假设我们想检查两个
集合
v
w
是否相等:

  • 检查它们的大小是否相等。如果不是,则返回
    false
    这引用了
    PySetObject
    size
    属性,因此它是一个常量时间操作

  • 检查两个
    集合是否都是
    冻结集合
    。如果是,并且它们的哈希值不同,则返回
    false
  • 同样,它引用了
    PySetObject
    hash
    属性,这是一个常量时间操作。这是可能的,因为
    frozenset
    是不可变的对象,因此在创建它们时会计算它们的哈希值

  • 检查
    w
    是否是
    v
    的子集
  • 这是通过迭代
    v
    的每个元素并检查它是否存在于
    w
    中来实现的

    迭代必须在所有
    v
    上执行,因此在最坏情况下,其大小是线性的(如果在最后一个位置发现不同的元素)

    集合的隶属度测试通常在平均情况下采用恒定时间,在最坏情况下采用线性时间;在平均情况下,将这两种方法结合起来,时间在
    v
    的大小上呈线性,在最坏情况下,时间与
    len(v)*len(w)
    成比例

    从某种意义上说,这是最坏情况的平均情况,因为它假设前两个检查总是返回
    true
    。如果您的数据很少倾向于具有相同大小的
    集合,这些集合也具有相同的哈希值,但包含不同的对象,那么在平均情况下,比较仍将在恒定时间内运行。

    两者都有,并用于相等性测试。这里没有区别


    set\u richcompare()
    ,如其他答案所述,比较大小,然后进行散列。然后,它将在集合1中的每个元素上循环,并检查它是否在集合2中。此支票在其他方面与相同。这是通过哈希表查找完成的,对具有相等哈希的项进行线性搜索。存在性检查的复杂度为,因此
    set_issubset()
    的检查的复杂度为O(len(s1))摊销,或O(len(s1)*len(s2))最坏情况。

    哈希值不能判断这两个对象是相同的。它们会告诉我们它们是否不同。如果散列匹配,将对它们进行比较。@dad。你是对的;我误读了密码。我将编辑我的答案。谢谢