好的,我需要一些严肃的运行时帮助!
此方法应该接受一个int值,检查它的素数,如果数字确实是素数,则返回true
。我理解为什么循环只需要达到i
平方,我理解最坏的情况是数字是素数(或素数的倍数)的情况。但我不明白如何量化实际的运行时间。
我亲自完成了循环,试图理解数字(n
)的模式或相关性以及发生了多少循环,但我确实觉得每次都会陷入同一个陷阱。我需要一种新的思考方式!
我有一个提示:
“想想整数的大小”
这使得我想要量化一个数字中整数的字面数与它在for循环中执行的迭代次数(floor log(n)) +1
)的关系。但它不是工作?!我知道它显然不是平方根n
。
我要求Big O表示法。
public class PrimeHunter
{
public static boolean isPrime(int n)
{
boolean answer = (n > 1) ? true : false; //runtime = linear runtime
for (int i = 2; i * i <= n; i++) //runtime = ?????
{
if (n % i == 0) //doesn't occur if it is a prime
{
answer = false;
break;
}
}
return answer; //runtime = linear runtime
}
}
答案 0 :(得分:1)
I KNOW it isnt square root n obviously.
嗯,如果它不是平方根,那绝对没有其他可能性。
我想到了这一点,除非你在这里省略了什么,否则绝对必须与平方根有关。如果我弄错了,请纠正我。
要使循环成为log(n),你必须在for循环中执行Math.pow(10,i)。
在您的情况下,运行时将为O(sqrt(n)-1)。
要将n
与i
进行比较,您必须取n的平方根,但由于i
从2开始,您必须从中减去1。
编辑: 实际上,你是对的。
上述O时间仅适用于素数。 对于非素数,它是n减2的最小素数正因子。
如果删除break
,则可以更轻松地计算运行时间。
答案 1 :(得分:0)
这样做的一种直观方式是制作图表。
选择一堆n
值,例如1到20.绘制出一个图表,其中x轴是n
值,y轴是最坏情况下的循环次数会跑。你应该得到一个可视化。
一旦可视化,它就会变得更加明显。如果没有,那么你可以在同一个图表上绘制一些已知的Big-O符号,看看它们是如何比较的。例如,它是接近线性值(O(n)
),指数值(O(n^2)
)还是对数(O(log(n))
)值?如果您需要更准确的Big-O值,您可以从那里开始。
考虑它的第二种方法是关注这一点:
I understand why the loop only needs to go up to i squared
根据i
而非i*i
来考虑。 for循环一直持续到i*i = n
,其中i
是迭代次数。解决i
。
答案 2 :(得分:0)
只有一个循环。它在maxi - 2 + 1
maxi*maxi = n
处执行%
次。内部的操作是相同的(采取(受限)一个恒定的时间)。我认为你是在思考这个问题。
实际上,你的教授可能会遇到一些绊脚石。模运算的时间复杂度{{1}}。在这种情况下,内部术语不是很稳定。
答案 3 :(得分:0)
public static boolean isPrime(int n) <----------- Runtime of floor(logn) +1
boolean answer = (n > 1) ? true : false; <------ constant runtime
for (int i = 2; i * i <= n; i++) <------runtime square root n
Total runtime = log(sqrtn) + 1
reduces to 10^n
F.M.L.
QED