为素数算法找到大哦[重复]
Posted
技术标签:
【中文标题】为素数算法找到大哦[重复]【英文标题】:finding big oh for prime algorithm [duplicate] 【发布时间】:2014-02-25 15:09:02 【问题描述】: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 oh。 我假设从 i=2 到 i 的算法
有人能用大 oh 表示法根据输入 num 来解释这两种算法的运行时间吗?
【问题讨论】:
“我假设从 i=2 到 i 的算法”... 是吗?您对此有何假设? 这是您关于单循环大o 的第三个非常基本的问题。也许你应该买一本关于这个主题的书或视频讲座...... 其实big-oh一般来说不是很有趣,你应该关心实际性能。是的,这可能非常不同。在这种情况下,您在循环中计算平方根,这可能会相当昂贵。因此,只要这些令人眼花缭乱的猪坐在那里,任何性能优化都是毫无意义的。好吧,也许你很幸运,编译器会为你解决这个问题,但你不应该依赖它。 也许我的眼睛在捉弄我,但是.. for 循环条件不应该是 'i 【参考方案1】:由于if
-statement 中只有常量语句,因此总时间复杂度实际上由for
-loop 决定。
for(int i=2; i<sqrt(num); i++)
这意味着它将运行sqrt(num)-2
次,因此总复杂度为O(sqrt(n))
。
很容易,如果for
-loop 更改为:
for(int i=2; i<num/2; i++)
,它将运行num/2-2
次,因此总复杂度将为O(num)
。
【讨论】:
【参考方案2】:如果你运行它,你实际上会经历循环sqrt(num)-2
次,即对于 i==2 到 i==sqrt(num),每次递增 1。
因此,就num
的大小而言,该算法的运行时间为O( sqrt(num) )
。
【讨论】:
与注释的替代方案相比,即 O(n)。使用平方根版本。【参考方案3】:如其他答案所述,从 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...
【讨论】:
【参考方案4】:首先我们必须指定我们的任务。所以我们想要的是找到一个函数
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)
【讨论】:
以上是关于为素数算法找到大哦[重复]的主要内容,如果未能解决你的问题,请参考以下文章