寻找主要算法的大哦

时间:2014-02-25 15:09:03

标签: c++ algorithm big-o time-complexity primes

void print(int num)

{
    for(int i=2; i<sqrt(num); i++) // VS for(int i=2; i<num/2; i++)
    {
        if(num%i==0)
        {
            cout<<"not prime\n";
            exit(0);
        }
    }
    cout<<"prime\n";        
}

我知道这些算法很难找到素数,但我希望通过这些例子了解Big哦。 我假设算法从i = 2到i

有人可以用输入数字来解释这两种算法的运行时间吗?

4 个答案:

答案 0 :(得分:1)

如果你运行它,你将实际经历循环sqrt(num)-2次,即对于i == 2到i == sqrt(num),逐步增加1。

因此,就num的大小而言,此算法的运行时间为O( sqrt(num) )

答案 1 :(得分:1)

由于只有常量语句在if语句中,因此总时间复杂度实际上由for - 循环确定。

for(int i=2; i<sqrt(num); i++)

这意味着它将运行sqrt(num)-2次,因此总复杂度为O(sqrt(n))

很容易,您会意识到for - 循环是否变为:

for(int i=2; i<num/2; i++)

,它将运行num/2-2次,因此总复杂度将为O(num)

答案 2 :(得分:1)

首先我们必须指定我们的任务。所以我们想要的是找到一个函数

f(N) = number_of_steps

当N是传递给函数的num参数时。从这一点开始,我们将假设每个不依赖于输入数据大小的句子都需要一个C个常数计算步骤。

我们将添加该功能的各个步骤。

f(N) = for_ + C;

现在执行多少次? sqrt(N)-2,所以:

f(N) = sqrt(N) -2 + C = sqrt(num) -2 + C

O( f(num)) = sqrt(num)

答案 3 :(得分:1)

如其他答案中所述,从2到sqrt(n)迭代的算法的成本是O(sqrt n),并且从2到n / 2迭代的算法的成本是O(n)。但是,这些界限适用于最坏情况,最坏的情况发生在n为素数时。

平均而言,两种算法都在O(1)预期时间内运行:一半的数字是偶数,因此它们的成本是2 * n / 2。三分之一的数字是3的倍数,所以它们的成本是3 * n / 3。 1/4的数字是4的倍数,因此它们的成本是4 * n / 4 ......