我目前是一名数据结构课程的CS本科生。在本学期中,我们了解了big-O表示法,并且在一次作业中,我们不得不写出将数字1 + 2 + 3 + ... + n相加的big-O表示法。我认为,在最简单的方法中,您将要从1循环到n,并且在每次迭代中将i加到总和上,因此这似乎是O(n)时间。
我还知道,这种特定的总和可以表示为(n(n + 1))/ 2,作为接收答案的更直接的方法。
我的教授坚持认为,在两种情况下,时间复杂度均为O(n ^ 2),我一直在给他发电子邮件,以期得到更好的解释,但他基本上每次都发送相同的答复。
我觉得我首先应该误解了big-O的目的。即使我实现了这两种在程序中求和并执行时间的方法,循环方法的时间似乎也根据n的大小线性增加,而在第二种方法中,它花费的时间相同n的大小无关紧要,因为在这种情况下不会发生迭代。
有人可以帮我理解为什么它仍然是O(n ^ 2)吗?
答案 0 :(得分:1)
如果通过逐个迭代数字进行求和,答案为O(n)。
如果直接使用公式求和,答案为O(1)。
答案 1 :(得分:0)
这可能是一种误解,而1,2,...,n是所执行的另一项操作的时间值,这意味着执行该操作的时间会不断增加,因此您必须给Big -O执行此一系列操作?
否则,当任务实际上只是将1到n的所有数字求和并用Big-O表示法表示该时间时,当您采用遍历所有方法的循环时,您认为它是O(n)是正确的元素,使用n *(n + 1)/ 2公式,您甚至可以获得O(1)。
答案 2 :(得分:0)
在这样的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;
}
该加法称为n
次,因此整个代码的时间复杂度为 O(1)* n = O(n)。
如果您的问题没有遗漏, O(n)将是任务的正确答案。
无论如何,教授很有可能是正确的;-)
O(n *(n + 1)/ 2)= O(n / 2)* O((n + 1)/ 2)= O(n)* O(n + 1)= O (n)* O(n)= O(n * n)= O(n ^ 2)
答案 3 :(得分:0)
您正在计算错误值的顺序。
正如您在评论中指出的那样,该问题并未询问进行总和的时间复杂度;问题问和本身的顺序是什么。确实是1 + 2 + ... + n为O(n²)。