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