Python中dict.keys()的时间复杂度是多少?
我解决问题时遇到了一个问题。虽然我的解决方案被系统接受,但在网上搜索以下问题后,我仍然没有任何想法:Python中dict.keys()的时间复杂度是多少?,python,Python,我解决问题时遇到了一个问题。虽然我的解决方案被系统接受,但在网上搜索以下问题后,我仍然没有任何想法: dict.keys()操作的时间复杂度是多少? 它返回键的视图还是键的真实列表(存储在内存中)?在Python 2中,它是O(n),并构建一个新列表。在Python3中,它是O(1),但不返回列表。要从dict的键中提取随机元素,需要将其转换为列表 听起来您可能使用了random.choice(d.keys())来解决问题的第3部分。如果是这样,那就是O(n),而你错了。您需要实现自己的哈希表或
dict.keys()操作的时间复杂度是多少?
它返回键的视图还是键的真实列表(存储在内存中)?在Python 2中,它是O(n),并构建一个新列表。在Python3中,它是O(1),但不返回列表。要从dict的键
中提取随机元素,需要将其转换为列表
听起来您可能使用了
random.choice(d.keys())
来解决问题的第3部分。如果是这样,那就是O(n),而你错了。您需要实现自己的哈希表或维护单独的元素列表,而不牺牲插入和删除的平均大小写。在Python3.x中,它的复杂性是0(1)
。在Python2.x中,它返回一个列表,因此填充它或对它执行一些查找需要0(n)
。您是在询问Python2还是Python3?@Robᵩ 没错,但我认为OP是在询问调用.keys()
的成本,而不是反复询问。是的。正如@ozgur所指出的,仅仅调用dict.keys()
而不对结果进行任何处理,在Python2中是O(n)
,在Python3中是O(1)
。@ozgur Yep。我问的是调用.keys()的成本,而不是重复调用。我使用了返回self.elements.keys()[randint(0,len(self.elements)-1)]
,它被接受了(self.elements是一个dict对象
)。正如您所说的“在Python 3中,它是O(1)”。如果self.elements.keys()
是O(1)
,那么整个表达式将在O(1)
中运行。如果我犯了错误,请纠正我:)@Jason:dict.keys()
的设置与Python 3类似;如果不将其转换为列表、元组或其他内容,就无法从中提取随机元素。@Jason:“索引操作……如何工作”-它不工作。在Python3上,您会得到一个TypeError。@Jason,在Python3中,您会得到TypeError:“dict\u keys”对象不支持索引