【发布时间】:2018-12-31 23:08:22
【问题描述】:
我开始学习数据结构+算法,但遇到了一个问题。这是我正在测试的功能:
def create_list_with_concat(n):
l = []
for i in range(n):
l = l + [i]
这是我的思考过程:
我知道 concat 运算符是 O(k) 其中k 是添加到原始列表的列表的大小。由于在这种情况下k 的大小始终为1,因为我们一次添加一个字符列表,因此 concat 操作采用1 步骤。由于循环迭代n 次,算法将执行n 步骤——每次迭代执行1 步骤。因此,算法的时间复杂度为O(n)。该算法的实际执行时间类似于T(n) = dn,其中d 是执行连接所需的时间。对于这样一个函数,我希望以下是正确的:当您将输入大小增加 10 倍时,输出(执行时间)将增加 10 倍,因为:
(x, dx) --> (10x, 10dx) --> 10dx/dx = 10
但是,当我在实际值和执行时间上实际测试算法时,这似乎并没有发生。相反,当我将输入大小增加 10 倍时,输出(执行时间)增加 100 倍,当我将输入大小增加 100 倍时,输出增加 10000 倍。这些输出表明二次时间函数和O(n squared)。
这是我的完整代码:
import timeit
def create_list_with_concat(n):
l = []
for i in range(n):
l = l + [i]
t1 = timeit.Timer("create_list_with_concat(100)", "from __main__ import
create_list_with_concat")
print("concat ",t1.timeit(number=1)*1000, "milliseconds")
t1 = timeit.Timer("create_list_with_concat(1000)", "from __main__
import create_list_with_concat")
print("concat ",t1.timeit(number=1)*1000, "milliseconds")
# OUTPUT
# concat 0.05283101927489042 milliseconds
# concat 2.8588240093085915 milliseconds
非常感谢您的帮助。
【问题讨论】:
-
您意识到
l = l + [i]和l += [i]之间存在差异? -
@WillemVanOnsem 就最终结果而言,没有。如果您指的是在较低级别发生的事情,那么如果您要分享您的知识会很好。
-
@chb:但问题涉及时间复杂度,并且就时间复杂度而言,对于列表来说存在差异。
-
@WillemVanOnsem 抱歉,在审核队列中,没有看到您发布了答案。
标签: python algorithm data-structures time-complexity