Python 我应该使用字典进行会员资格测试吗?
假设我有两个列表A,B,A是B的子集。如果我要解析B的点,每次我想测试一个元素是否是A的成员,将A表示为字典会比表示为列表更好吗?我这样问是因为我觉得字典的最坏情况查找时间是O(1),而数组的最坏情况查找时间是O(n) 也就是说,以下哪项在时间复杂度方面更有效Python 我应该使用字典进行会员资格测试吗?,python,python-3.x,time-complexity,Python,Python 3.x,Time Complexity,假设我有两个列表A,B,A是B的子集。如果我要解析B的点,每次我想测试一个元素是否是A的成员,将A表示为字典会比表示为列表更好吗?我这样问是因为我觉得字典的最坏情况查找时间是O(1),而数组的最坏情况查找时间是O(n) 也就是说,以下哪项在时间复杂度方面更有效 # Code 1 A = [1, 2, 3] B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3] for i in B: if i in A: print (i)
# Code 1
A = [1, 2, 3]
B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3]
for i in B:
if i in A:
print (i)
else:
print (-1)
似乎如果我上面所说的关于时间复杂性的话是真的,那么第一个代码的复杂性是O(| B | x | A |),而第二个代码的复杂性是O(| B |)。这是正确的吗 你应该用这个。它们有O(1)查找,就像dict一样,但它们不是键值对
您的代码将如下所示:
A=[1,2,3]
B=[1,2,3,4,5,6,7,8,1,2,3,4,1,2,3]
A_集=集(A)
对于B中的i:
如果我在一个集合中:
印刷品(一)
其他:
打印(-1)
或:
A={1,2,3}
...
我的印象是,字典的最坏情况查找时间为O(1),而数组的最坏情况查找时间为O(n)。
正确。(除了某些边缘情况,因此,在摊销最坏情况下O(1)查找时间更好)此外,set
也有一个O(1)查找,因此如果您不需要键值对,set
比dicts更有意义您应该使用set
进行成员资格测试!这是成员资格的优化对象类型。同样,您的第二个代码是非常奇怪和迂回的检查项目是否存在的方法。您可以在中使用来检查成员资格,即使是在dicts中也是如此。@paritossingh是的。非常感谢你们两位。
# Code 2
A = [1, 2, 3]
B = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 1, 2, 3]
A_dict = {}
for i in A:
A_dict[i] = 0
for i in B:
if i in A_dict:
print (i)
else:
print (-1)