如果我理解时间复杂度的计算,我根本不确定。我得到了这些循环,这些是我的计算。但是,我不确定在这里对大O有什么说法。
循环1:
lst = []
i=1
while i<n:
lst = list(range(i))
i *= 2
我假设每个操作花费O(1)时间。在该循环中,第1行和第2行分别执行1次。 while循环的第一行有3个操作 - 范围,列表和该值到lst的赋值。由于我们处理范围,我认为它运行n + 1次。
循环的最后一行有2个操作:乘以2并将该值赋给i,它运行n次。
由此,我认为总数将是: 1 + 1 + 3(n + 1)+ 2n = 5n + 5。
由于这是一个线性函数,那么大O将是O(n)?
===============
循环2:
lst = []
i=1
while i<n:
lst = lst + [i]
i *= 2
这里我们有类似的情况,但是while循环的第一行有2个操作。
然后,
1 + 1 + 2n + 2n = 4n + 2.
因为它是线性函数,所以它也是O(n)?
========================== 循环3:
lst = []
i=1
while i<n:
lst += [i]
i *= 2
我认为lst + = [i]将执行2次2次操作,因为这是就地计算?我不确定这一点。如果这是对的,那么总数就是 6N + 2
问题是:我计算这些是对还是我完全错了?如何为每个循环编写大O?
答案 0 :(得分:0)
LOOP 1:O(n log n)
循环运行log2(n)次,其平均值为O(log n)。每次迭代都会(最坏的情况下)执行n次操作。所以复杂性是O(n log n)。
LOOP 2:O(log n)
循环运行log2(n)次,其平均值为O(log n)。 我想赋值lst = lst + [i]
只是添加节点(而不是新列表)。它的平均值为O(1),因此复杂度为O(log n)。 如果我错了,则赋值会创建新列表,因此每次迭代都会执行(最坏情况下)n次操作。所以复杂性是 O(n log n)
LOOP 3:O(log n)
与循环2一样。这里,赋值是O(1)肯定,而不是假设......