【发布时间】:2015-06-17 08:18:50
【问题描述】:
此代码示例采用 (N^2) 的大 O
results = []
for i in range(1000000)
result = [f(i)] + results
此代码示例采用 (N) 的大 O
results = []
for i in range(1000000)
result = results + [f(i)]
为什么这两种算法的Big O有如此明显的区别,唯一的区别是一个加到列表的最前面而另一个加到列表的后面?
这对 Java 也适用吗?
【问题讨论】:
-
"在内部,一个列表表示为一个数组;最大的成本来自于超出当前分配大小的增长(因为所有东西都必须移动),或者来自靠近开头的某处插入或删除(因为之后的所有内容必须移动)。” - wiki.python.org/moin/TimeComplexity#list
-
这两个都是 O(N^2)。
for i in xrange(1000000): results += [f(i)]是 O(N) -
实际上,当前代码中的 O(N^2) 都不是 O(N^2),因为
result永远只有一个元素,而results始终是空列表。这两个语句都没有重新分配results变量。 -
result和results之间的区别是错字吗? -
dupe?