乘法的算法复杂度

时间:2015-10-07 22:10:57

标签: c algorithm time-complexity

在被指责为重复之前,我已经在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)中。另一方面,第二种实现可能实际上是基于乘法运算符的实现运行更多指令。

1 个答案:

答案 0 :(得分:3)

教科书乘法需要时间O(b ^ 2)其中b是数字中的位数,因此使用公式n(n + 1)/ 2需要时间O((log n)^ 2)这是多比O(n)快。