Time complexity 1+的大O表示法;2+;3++;N

Time complexity 1+的大O表示法;2+;3++;N,time-complexity,big-o,Time Complexity,Big O,我目前是数据结构课程的CS本科生。在这学期里,我们学习了大O符号,在一项作业中,我们必须写出数字1+2+3+…+n之和的大O符号。我认为,在最简单的方法中,你将从1循环到n,在每次迭代中,把I加到和中,所以这似乎是O(n)时间 我也知道,这个具体的总和可以表示为(n(n+1))/2,这是一种更直接的获得答案的方式 我的教授坚持认为,在这两种情况下,时间复杂度都是O(n^2),我一直在给他发电子邮件,希望得到更好的解释,但他基本上每次都会发送相同的回复 我觉得我一定是误解了big-O的初衷。即使我

我目前是数据结构课程的CS本科生。在这学期里,我们学习了大O符号,在一项作业中,我们必须写出数字1+2+3+…+n之和的大O符号。我认为,在最简单的方法中,你将从1循环到n,在每次迭代中,把I加到和中,所以这似乎是O(n)时间

我也知道,这个具体的总和可以表示为(n(n+1))/2,这是一种更直接的获得答案的方式

我的教授坚持认为,在这两种情况下,时间复杂度都是O(n^2),我一直在给他发电子邮件,希望得到更好的解释,但他基本上每次都会发送相同的回复

我觉得我一定是误解了big-O的初衷。即使我在程序中实现这两种求和的方法并计算执行时间,循环方法的时间似乎也会根据n的大小线性增加,而在第二种方法中,无论n有多大,都会花费相同的时间,因为在这种情况下不会发生迭代


有人能帮我理解为什么这仍然是O(n^2)?

这可能是一种误解吗?1,2,…,n是另一个执行的操作的时间值,这意味着执行该操作的时间不断增加,并且您必须为该操作序列给出大O


否则,当任务实际上只是将从1到n的所有数字相加,并用大O表示法表示时间时,您的观点是正确的,当您采用循环所有元素的方法时,使用n*(n+1)/2公式,您得到的是偶数O(1)。

在这样的Java示例中

int n = 1000;
int sum = 0;

// iterating n times
for (int i = 1; i <= n; i++) {
    // just a basic operation, so no extra complexity here
    sum += i;
}
int n=1000;
整数和=0;
//迭代n次
对于(inti=1;i,如果你通过一个接一个地迭代数字来求和,那么答案是O(n)


如果直接使用求和公式,答案是O(1)。

计算的数值顺序错误

正如你在评论中指出的,问题并不是问求和的时间复杂度是多少,而是问求和本身的顺序是什么。事实上是1+
2+…+n是O(n²)。

感谢您的快速回复,作业中的问题是“以下哪一个是1+2+3+…+n的正确大O表达式?A.O(logn)B.O(n)C.O(n logn)D.O(n²)”,所以甚至没有常数时间的选项,这使得他一开始就提出了这个公式,这很奇怪。好吧,我想你的教授是对的。我不是一个英语母语的人,但问题不是给出计算和所需时间的大O表达式,而是1+2+…+n是值,取决于n。而且,正如你所说的,这是n*(n+1)/2,也就是(n^2)/2+n/2,所以O(n^2)答案是正确的。可能是这样,但他不断地提出操作发生的次数和迭代次数,但如果他只是指结果本身,那么他提出这些东西只是让问题变得更加混乱。我知道他自己并没有提出这个问题,因为你可以在谷歌上找到它,而且他也不是一个土生土长的英国人sh演讲者,所以这可能是我们双方的误解。他告诉我答案取决于我们正在执行的操作的数量,在(n(n+1)/2的情况下,我只看到3个操作发生在那里。如果他愿意花时间适当地解释它,而不是发送给我“答案是O(n^2)”因为它是(n(n+1))/2“无论我要求他解释多少次,作为回答。谢谢你的回答,但在回复我的一封电子邮件时,当我问我们是否只关心顺序而不是时间复杂度时,他说这个问题与时间复杂度和执行的操作数量有关。我真的不知道现在该怎么想,他的la对我的测试回答是“每个迭代都需要i个操作,所以我们总共有n(n+1)/2个操作”,我只是越来越困惑,因为在这个公式的情况下,没有迭代发生?知道每个迭代中发生了什么会很好(教授在想)…我希望他不是指从
1
n
的值求和的迭代。…我不完全确定,从他那里得到的答案是O(n^2)似乎很不可能没有解释就给你正确的答案是一种非常奇怪的教学方式…然后给出正确的答案,通过作业并与其他人讨论。我认为除了与不同的教授交谈之外没有其他选择。使用公式(n*(n+1))/2求和输入的复杂性是O(1).你为什么在那里用大O符号?