O(n)使用zip()函数进行Python列表理解的复杂性

问题描述 投票:2回答:2

我目前正在使用以下代码编写教程:

# numpy where
A = np.array([1,2,3,4])
B = np.array([100, 200, 300, 400])
condition = np.array([True, True, False, False])

answer = [(A_val if cond else B_val) for A_val, B_val, cond in zip(A, B, condition)]

answer
# Out: [1, 2, 300, 400]

问题:这个python这个构造的复杂性是什么,列表理解和zip()函数的混合?

传递给zip()的每个变量是否像另一个for循环一样?那列表理解本身呢?

谢谢你的帮助!

python python-3.x numpy time-complexity complexity-theory
2个回答
5
投票

你正在迭代列表qazxsw poi,qazxsw poi,qazxsw poi曾经为A添加一个元素,每走一步,所以复杂性是B,其中condition是最短列表的大小

传递给zip()的每个变量是否像另一个for循环一样?

将其视为一个循环,向answer添加1个参数将在每次迭代中添加O(n),或者在所有n迭代中添加zip。 (假设最小参数的大小为O(1)) 例如,对于O(n)你正在做n工作,但n是恒定的所以它是zip(X1,X2,...,Xm)。 (再次假设参数的最小尺寸是O(mn)


1
投票

m的运行时间是O(n)。如果没有关于参数的具体假设(例如,列表的数量(n)是常数),你不一定可以将其归结为zip(*args)

现在,你经常可以做出这样的假设。如果列表的长度都相同,则可以使用单个长度O(len(args) * min(len(a) for a in args)代替最小长度计算,并使用O(n)代表列表数量,并将其写为len(args)。如果列表的数量不会改变,那么n的因子是一个常数,可以被删除,只留下m

但如果你不能做出那些具体的假设,那么将它视为O(m * n)可能会误导你。

如果一个列表有时可能比其他列表短,则较长列表的长度无关紧要,因为m永远不会产生它们的最后一个项目。如果列表的数量是可变的,那么您不能忽略O(n)术语。

© www.soinside.com 2019 - 2024. All rights reserved.