【发布时间】:2017-12-02 20:22:42
【问题描述】:
我有一个关于在 python 中遍历列表的问题。 假设我有列表 A = [1, 2, 3, 4] 和 B = []。使用这两个周期有什么区别(如果有的话)?我对时间复杂度很感兴趣。
for i in range(len(A)):
B.append(A[i])
for i in A:
B.append(i)
【问题讨论】:
标签: python iterator time-complexity
我有一个关于在 python 中遍历列表的问题。 假设我有列表 A = [1, 2, 3, 4] 和 B = []。使用这两个周期有什么区别(如果有的话)?我对时间复杂度很感兴趣。
for i in range(len(A)):
B.append(A[i])
for i in A:
B.append(i)
【问题讨论】:
标签: python iterator time-complexity
这两个操作循环的时间复杂度相同。
这样想:
他们需要进行多少次迭代?
他们都必须做len(A) 循环次数。因此,它们将花费相同的时间。
另一种写法是O(n)。这是Big-O-Notation 的示例,仅表示时间复杂度为linear - 即如果列表从长度5 --> 10 变为长度相同,则两个操作将花费相同的时间从长度变为1000 --> 1005。
--
在另一个答案中从这个伟大的explanation 偷来的下面的图可以清楚地看到其他时间复杂性:
【讨论】:
根据this question/answer,len(A) 的时间复杂度为 O(1),因此它不会增加您提到的第一个循环的复杂性。两种可能性都必须进行 n 个循环,其中 n 是 A 的长度。 总而言之,这两种可能性的时间复杂度都是 O(n)。
【讨论】:
每个循环都是O(n),或线性时间:
for i in range(len(A)):
B.append(A[i])
for i in A:
B.append(i)
每个append 操作都是O(1),在B.append(A[i]) 发生的索引也是O(1)。因此,此代码块的整体时间复杂度为:
T(N) = O(n) + O(n) = 2*O(n) => O(n)
因为 Big - O 测量最坏情况。
【讨论】: