在被指责为重复之前,我已经在StackOverflow上找到了这个答案的所有内容,并且找不到可以向我解释的内容,所以请先阅读完整内容。
假设您需要编写一个取整数n的函数,并返回1..n的正整数之和(我将使用C)。
int sum_of_integers(int n) {
int i, counter = 0;
for(i = 1; i <= n; i++)
counter += i;
return counter;
}
显然,该算法处于O(n)时间,因为它运行的指令数与输入大小n成正比。
然而,考虑这个实现,使用1 + ... + n =(n)(n + 1)/ 2的数学真理。
int sum_of_integers(int n) {
//Trying to avoid potential int overflow
//And take into account int division
if(n % 2 == 0)
return (n/2)*(n+1);
return ((n+1)/2)*n;
}
我的问题:因为乘法在技术上是大-O&gt; O(n),是第一个首选的实现?第二种实现是否被认为是O(1)?
对我来说,因为对于第二次实现来说n的大小并不重要,因为相同的操作执行的次数相同,我觉得它应该在O(1)中。另一方面,第二种实现可能实际上是基于乘法运算符的实现运行更多指令。
答案 0 :(得分:3)
教科书乘法需要时间O(b ^ 2)其中b是数字中的位数,因此使用公式n(n + 1)/ 2需要时间O((log n)^ 2)这是多比O(n)快。