Python 有人能解释一下这一行的复杂性吗?
我在计算这条线的时间复杂度时遇到了麻烦。对我来说,这似乎是二次O(n**2)。因为如果我不使用列表理解,我必须通过这里的嵌套循环Python 有人能解释一下这一行的复杂性吗?,python,list-comprehension,complexity-theory,Python,List Comprehension,Complexity Theory,我在计算这条线的时间复杂度时遇到了麻烦。对我来说,这似乎是二次O(n**2)。因为如果我不使用列表理解,我必须通过这里的嵌套循环 AB = Counter([(a+b) for a in A for b in B]) 您的线路: AB = Counter([(a+b) for a in A for b in B]) 相当于(忽略列表理解更快且不逐个追加*)的事实: 关于列表理解的区别:理解实现更快(已解释),但这并不意味着它的时间复杂度与O(n2)不同。另外:append是O(k)
AB = Counter([(a+b) for a in A for b in B])
您的线路:
AB = Counter([(a+b) for a in A for b in B])
相当于(忽略列表理解更快且不逐个追加*)的事实:
- 关于列表理解的区别:理解实现更快(已解释),但这并不意味着它的时间复杂度与O(n2)不同。另外:append是O(k)
总之,它是以O(n2)为界的。事实上,它是O(n**2),这正是你所说的原因。你为什么感到困惑?因为我注意到在LeetCode列表中理解要快一点。如果需要和嵌套相同的时间,为什么会发生这种情况?顺便说一句,非常感谢您的回复。当代码X比Y快时,您无法得出X的时间复杂度比Y好的结论。事实并非如此。甚至可以证明X的时间复杂度比Y差。a或B是否有已知的大小,相对于另一个或常数?我将其表示为O(A*B),除非您可以安全地假设A和B的大小相似(并且都可以称为“n”)。
O(n*M)
--与等效嵌套循环相同(n
是A的线性大小,M
是B的线性大小)--由于字节码的开销,ListComp比python中的普通循环稍微快一点,但它们在算法上并不是那么简单。我得到了它。
# given lists A, B
AB0 = []
# this is O(n2)
for a in A:
for b in B:
AB0.append(a+b)
AB = {}
# this is O(m), m=n2
for ab in AB0:
if ab not in AB:
AB[ab] = 0
AB[ab] += 1