【问题标题】:Time complexity of python set operations?python集合操作的时间复杂度?
【发布时间】:2011-11-13 04:00:49
【问题描述】:

Big O 表示法中 python 的每个集合操作的时间复杂度是多少?

我正在使用 Python 的 set type 对大量项目进行操作。我想知道每个操作的性能将如何受到集合大小的影响。例如add,成员资格测试:

myset = set()
myset.add('foo')
'foo' in myset

谷歌搜索没有找到任何资源,但仔细考虑 Python 的集合实现的时间复杂度似乎是合理的。

如果存在,指向this 之类的链接会很棒。如果没有类似的东西,那么也许我们可以解决它?

求所有集合操作的时间复杂度的加分项。

【问题讨论】:

  • 虽然 GWW 的链接提供了非常丰富的信息,但您可以通过理解它们只是 python 字典的特殊情况(键,但没有值)来推断 python 集合的时间复杂度。所以,如果你知道哈希映射上操作的时间复杂度,你就差不多了。

标签: python data-structures set complexity-theory big-o


【解决方案1】:

操作in 应该与容器的大小无关,即。 O(1) -- 给定一个最优散列函数。对于 Python 字符串,这应该几乎为真。散列字符串总是很关键,Python 应该很聪明,因此您可以期待接近最佳的结果。

【讨论】:

    【解决方案2】:

    根据Python wiki: Time complexity,set 实现为hash table。因此,您可以期望在 O(1) 平均时间内查找/插入/删除。除非您的哈希表的负载因子太高,否则您将面临冲突和 O(n)。

    附:出于某种原因,他们声称删除操作需要 O(n),这看起来像是一个错误的输入。

    附言CPython 也是如此,pypy 是 different story。

    【讨论】:

    • 在python中设置也做自动排序。所以你认为插入新值仍然是 O(1) 时间复杂度
    • @thakurinbox 你能用链接支持你的声明吗?
    • 自动“排序”不排序。
    【解决方案3】:

    其他答案没有谈到集合上的两个关键操作:联合和交集。在最坏的情况下,联合将采用 O(n+m) 而交集将采用 O(min(x,y)),前提是集合中具有相同哈希的元素不多。常见操作的时间复杂度列表可以在这里找到:https://wiki.python.org/moin/TimeComplexity

    【讨论】:

    • 哇,这是一个非常有用的答案,它使我的代码加快了几个数量级,谢谢!
    猜你喜欢
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2012-03-17
    相关资源
    最近更新 更多