python Dictionary.values() 的时间复杂度是多少?

时间:2021-05-13 07:10:50

标签: python

我参考了这个页面,但它显示了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) 中我必须检查所有键的值!!!

1 个答案:

答案 0 :(得分: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

问题(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]