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
有人可以用输入数字来解释这两种算法的运行时间吗?
答案 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 ......