我们的教授和各种材料说 Summation(n) = (n) (n+1) /2,因此是 theta(n^2)。但直观地说,我们只需要一个循环来找到前 n 项的总和!所以,它必须是 theta(n)。我想知道我在这里错过了什么?!
4 回答
所有这些答案都像原来的问题一样误解了这个问题:重点不是衡量一个算法对整数求和的运行时复杂度,它是在讨论如何推理算法的复杂性,该算法i
在每次通过时i
采取步骤1..n
. 考虑插入排序:在i
插入原始列表的一个成员的每一步中,输出列表的i
元素都很长,因此i
执行插入需要(平均)步骤。插入排序的复杂度是多少?它是所有这些步骤的总和,或i
for i
in的总和1..n
。该总和是n(n+1)/2
其中有一个n^2
,因此插入排序是O(n ^ 2)。
这段代码的运行时间是Θ(1)
(假设加法/减法和乘法是常数时间运算):
result = n*(n + 1)/2 // This statement executes once
您所描述的以下伪代码的运行时间确实是Θ(n)
:
result = 0
for i from 1 up to n:
result = result + i // This statement executes exactly n times
这是另一种计算它的方法,其运行时间为Θ(n²)
:
result = 0
for i from 1 up to n:
for j from i up to n:
result = result + 1 // This statement executes exactly n*(n + 1)/2 times
所有这三个代码块都计算从1
到的自然数之和n
。
此Θ(n²)
循环可能是您被要求分析的类型。每当您有表单的循环时:
for i from 1 up to n:
for j from i up to n:
// Some statements that run in constant time
您的运行时间复杂度为Θ(n²)
,因为这些语句执行准确的summation(n)
时间。
我认为问题在于您错误地假设求和公式具有时间复杂度 theta(n^2)。
该公式中有一个 n^2,但它不需要与 n^2 成比例的计算次数或时间量。
正如您所说,将循环中的所有内容加总为 n 将是 theta(n),因为您必须遍历循环 n 次。
但是,计算等式 n(n+1)/2 的结果将只是 theta(1),因为它是一个执行一次的计算,无论 n 有多大。
Summation(n) 为 n(n+1)/2 是指从 1 到 n 的数字之和。这是一个数学公式,可以在没有 O(1) 时间的循环的情况下计算。如果您迭代一个数组以对所有值求和,这是一个 O(n) 算法。