【问题标题】:what is time complexity of python Dictionary.values()?python Dictionary.values() 的时间复杂度是多少?
【发布时间】:2021-08-03 12:02:58
【问题描述】:

我参考了这个页面,但它显示了 Dict.keys() 的 时间复杂度。 https://wiki.python.org/moin/TimeComplexity

此表也显示相同的https://www.geeksforgeeks.org/complexity-cheat-sheet-for-python-operations/

Time complexity for lookup in dictionary.values() lists vs sets 在这种情况下,它会搜索每个键的list,所以它对我没有帮助。 因为在我的例子中,所有 Dict 的值都是一个整数。

Q(1):Dict.values() 是 O(1) 还是 O(n)?

Dict = {1:10,2:20,3:30,4:40}
if 10 in Dict.values():
    print("YES")

Q(2):在 python 中是否可以通过提供值来获取键?[如果提供的值在 Dict.values() 中多次出现,我想获取所有对应的键]

Dict = {1:10,2:20,3:30,4:40}
value = 20

我想通过这个值找到 key=2。是否可以使用 O(1),因为在 O(n) 中我必须检查所有键的值!!!

【问题讨论】:

  • 我认为您的两个示例都是O(n),但由于执行延迟,调用本身dict.values()O(1)
  • 如果你想测试一个值是否存在,并获取与一个值关联的键,那么你的字典是从后到前的。改为{10: 1, 20: 2, 30: 3, 40: 4}
  • @RoyCohen 首先你说它是 O(n) 然后你说 Dict.values() 是 O(1) 因为延迟执行[那我应该假设什么? O(1) 还是 O(n)?]
  • @kaya3 是的,这是真的。所以我假设,对我来说答案是否定的。
  • @AayushScet 调用dict.values()本身是O(1),但是当你使用dict.values()返回的对象时,它通常是O(n)(取决于你在做什么)。

标签: python


【解决方案1】:

Q(1):我觉得是O(1)

编辑:我错了。是 O(n)。感谢@Roy Cohen 和@kaya3。

测试代码:

import timeit
def timeis(func):
    def wrap(*args, **kwargs):
        start =  timeit.default_timer()
        result = func(*args, **kwargs)
        end =  timeit.default_timer()
        print(func.__name__, end-start)
        return result
    return wrap

import random
@timeis
def dict_values_test(dic,value):
    return value in dic.values()

tiny_dic = {i : 10*i for i in range(1000)}
value = random.randint(1,1000)
dict_values_test(tiny_dic,value)
small_dic = {i : 10*i for i in range(1000000)}
value = random.randint(1,1000000)
dict_values_test(small_dic,value)
big_dic = {i : 10*i for i in range(100000000)}
value = random.randint(1,100000000)
dict_values_test(big_dic,value)

结果:

dict_values_test 2.580000000002025e-05
dict_values_test 0.015847600000000073
dict_values_test 1.4836825999999999

Q(2):

代码:

def find_key_by_value(dic,find_value):
    return [k for k,v in dic.items() if v == find_value]
        
dic = {1:10,2:20,3:30,4:40,5:40}
print(find_key_by_value(dic,40))

结果:

[4, 5]

【讨论】:

  • 1000 始终是字典中的第 100 个值。时间都是 0 的事实意味着算法短路,而不是 O(1)
  • 请使用timeit,而不是time,对Python代码进行基准测试,尤其是单个操作。