T(n)=1+2+3+...+n
的复杂性是多少?我知道答案是O(n^2)
。什么是具有运行时T(n)
?
答案 0 :(得分:6)
具有运行时T(n)的算法的示例是什么?
如果你有一个迭代n
次的外循环和一个迭代i
次的内循环,其中i
是外循环的索引,内循环的主体将执行T(n)
次。
这种嵌套循环的一个例子是以下算法:
for i from 1 to n
for j from 1 to i
print "$j "
print "\n"
这是常见作业分配的解决方案,并打印出以下形状的数字金字塔:
1
1 2
1 2 3
答案 1 :(得分:3)
虽然@ sepp2k给出了一个很棒的答案,但这里有一些真实的算法可能有T(N) = 1+2+3+...+n
(因此我们称这种算法为O(n^2)
)
Insertion Sort最糟糕的情况:
它有一个外循环,循环n
次,对于内循环,它循环数组的已排序部分以找到插入下一个元素的位置,其中每个外循环迭代的排序部分增加1,所以最坏情况下的内循环将运行1+2+3+4+..+n-1
次
Longest Increasing Subsequence(LIS)使用naive implementation:直接实现递归关系
对于每次迭代i
,我们必须查看所有j
< i
Interval Graph Coloring(间隔分区):对每个间隔x
进行排序后,我们必须找到x
与x
冲突之前的间隔数,问题的答案是最大冲突数。因此,当外部循环循环每个间隔i
时,内部循环正在循环所有j
< i
Prime Generating使用天真素数测试:当然,我们可以使用n
内i
的所有n
上的天真素数测试,在i
内生成所有素数。也就是说,对于所有j
,我们循环所有i
< j
以查看i
是否划分#nav li a {
display: block;
padding: 8px 15px;
text-decoration: none;
font-weight: bold;
color: white;
}
实际上有许多算法都包含这样的结构,我所看到的大多数算法都可以通过使用更精彩的算法或高级数据结构来改进。
答案 2 :(得分:0)
在最坏的情况下,插入排序需要T(n)=1+2+3+...+n
有界时间步骤。选择排序每次都需要很多步骤,但它并不常见。
答案 3 :(得分:-2)
功能增长的顺序与您需要完成的操作数量有关。具有O(n)的函数的示例将是您在问题中提到的函数的慢速版本。在python:
total = 0
for i in range(n + 1):
total += i
这将是O(n),因为完成所需的时间将基于n线性缩放。
至于你在问题中给出的函数,它实际上是O(1),因为你只需要做一个操作:n(n+1)/2
。计算n(n+1)/2
所需的时间永远不会改变条形后端怪癖,但对于类似这样的事情,真正不应该无关紧要。