【问题标题】:What is the time complexity of dict.keys() in Python?Python 中 dict.keys() 的时间复杂度是多少?
【发布时间】:2016-08-30 05:01:33
【问题描述】:

我在解决this LeetCode problem 时遇到了一个问题。虽然我的解决方案被系统接受了,但是在网上搜索了以下问题后我仍然没有任何想法:

What is the time complexity of dict.keys() operation?

它是返回键的视图还是键的真实列表(存储在内存中)?

【问题讨论】:

  • 在 Python 3.x 中的复杂度是 0(1)。在 Python 2.x 中,它返回一个列表,因此填充它或对其执行一些查找需要 0(n)
  • 你问的是Python2还是Python3?
  • @Robᵩ 是真的,但我认为 OP 是在询问调用 .keys() 的费用,而不是对其进行迭代。
  • 是的。正如@ozgur 指出的那样,仅调用dict.keys() 而对结果不做任何事情是Python2 中的O(n) 和Python3 中的O(1)
  • @ozgur 是的。我在询问调用 .keys() 的成本,而不是对其进行迭代。

标签: python


【解决方案1】:

在 Python 2 中,它是 O(n),它会构建一个新列表。在 Python 3 中,它是 O(1),但它不返回列表。要从 dict 的keys 中抽取随机元素,您需要将其转换为列表,并且转换时间为 O(n)。

听起来您可能正在使用random.choice(d.keys()) 来解决该问题的第 3 部分。如果是这样,那就是 O(n),你错了。您需要实现自己的哈希表或维护一个单独的元素列表,而不牺牲平均情况 O(1) 的插入和删除。

【讨论】:

  • 我使用了return self.elements.keys()[randint(0, len(self.elements) - 1)],它被接受了(self.elements is a dict object)。
  • 正如你所说的“在 Python 3 中,它是 O(1)”。如果self.elements.keys()O(1),那么整个表达式将在O(1) 中运行。如果我犯了错误,请纠正我:)
  • @Jason: dict.keys() 在 Python 3 中类似于集合;如果不将其转换为列表或元组或其他内容,则无法从中绘制随机元素。
  • @Jason:“索引操作如何......工作” - 它没有。在 Python 3 上,您会收到 TypeError。
  • @Jason,在 Python3 中,你会得到 TypeError: 'dict_keys' object does not support indexing
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多