优化Primehunter的运行时间

时间:2013-10-20 03:16:38

标签: java big-o

好的,我需要一些严肃的运行时帮助!

此方法应该接受一个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
    }
}

4 个答案:

答案 0 :(得分:1)

I KNOW it isnt square root n obviously.

嗯,如果它不是平方根,那绝对没有其他可能性。

我想到了这一点,除非你在这里省略了什么,否则绝对必须与平方根有关。如果我弄错了,请纠正我。

要使循环成为log(n),你必须在for循环中执行Math.pow(10,i)。

在您的情况下,运行时将为O(sqrt(n)-1)。

要将ni进行比较,您必须取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