检查两个冻结集在Python中是否相等的时间复杂性

时间:2018-08-10 02:48:54

标签: python frozenset

在在线上的任何地方都找不到详细信息,比较两个冻结集时,Python会迭代其中一组元素中的元素吗?还是因为冻结集是可哈希的,它是否会检查冻结集的哈希值?

2 个答案:

答案 0 :(得分:3)

由于参考文档未对此进行任何说明,因此它依赖于实现,因此除了查看您所使用的Python版本的源代码(在CPython发行版的{{1}中)之外,没有任何答案。 }。查看Python 3.7.0的源代码,答案是“也许”;-)

平等首先检查冻结集的大小是否相同(Objects/setobject.c)。如果不是,则它们不能相等,因此将立即返回len()

否则将比较如果已经计算出哈希码。如果已经计算出它们,那么如果哈希码不相等,则立即返回False。调用逐个元素的其他代码,以检查一个元素是否是另一个元素的子集。

冻结集的哈希码并非仅针对哈希集的哈希值进行计算-这可能是一笔无法弥补的支出。因此必须强制执行。一开始,frozenset的主要用例是允许集合集,并且在 上下文中,哈希代码将作为将冻结集添加到包含集的正常部分进行计算。 C级集实现包含一个槽,用于记录哈希的计算时间(在计算时),并且初始化为-1(保留值,表示内部“无哈希码”)。

答案 1 :(得分:1)

hash(x) == hash(y)并不意味着x == y

>>> help(hash)
hash(...)
    hash(object) -> integer

    Return a hash value for the object.  Two objects with the same value have
    the same hash value.  The reverse is not necessarily true, but likely.

因此要比较两个frozenset值是否相等,您仍然需要检查两个集合的大小是否相同,然后检查一个集合中的每个元素是否也位于另一个集合中。

我把它留给有很多空闲时间的读者作为练习,以查找具有相同散列值的两个不同的frozenset