Python 有人能解释一下这一行的复杂性吗?

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)

我在计算这条线的时间复杂度时遇到了麻烦。对我来说,这似乎是二次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)

总之,它是以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