Java中此素数算法的时间复杂度

Java中此素数算法的时间复杂度,java,big-o,complexity-theory,time-complexity,primes,Java,Big O,Complexity Theory,Time Complexity,Primes,我是时间复杂性分析新手 如果有人能告诉我这是二次型还是非二次型,我将不胜感激。还有,如果有更简单的方法使它成为o(1) 公共类素数{ 公共布尔iPrime(int n){ 布尔值=真; for(int i=2;i

我是时间复杂性分析新手

如果有人能告诉我这是二次型还是非二次型,我将不胜感激。还有,如果有更简单的方法使它成为o(1)

公共类素数{
公共布尔iPrime(int n){
布尔值=真;
for(int i=2;i
如果有人能把它分解为为什么是这样,它肯定会帮助我学习。:)


非常感谢

该算法的最坏运行时间是O(n)。算法的工作原理是从2到n(因此循环运行O(n)次),并在每一步执行一些算术运算(每个运算在时间O(1)内运行)。因此,整个运行时为O(n)

你可以用几种方法来加快速度。一种方法是只数到√n而不是n本身,因为如果n有任何除数,那么这些除数中至少有一个是素数。有一个很酷的事实,一个数n的任何素数因子都不必大于√n、 所以你只需要数到√n、 包括在内。这会将您的运行时降低到0(√n) ,这是一个显著的进步

还有其他的算法可以用来进一步加速,但它们非常复杂,只对非常非常大的整数有用

您已经询问过如何将此时间降到O(1)。由于一个
int
中只能容纳有限多个可能的值,一个选项是构建一个包含所有适合
int
的素数的巨型表,将它们存储在哈希表中,然后在该表中查找有问题的数。它并不优雅,它是一个巨大的内存猪,但它会工作

根据您的用例,您可能还希望检查Eratosthenes筛,这将为您提供一种方法,在时间O(n)中计算所有质数,直到某个数字n,然后对该范围内的任何数字进行O(1)查询


希望这有帮助

该算法的最坏运行时间是O(n)。算法的工作原理是从2到n(因此循环运行O(n)次),并在每一步执行一些算术运算(每个运算在时间O(1)内运行)。因此,整个运行时为O(n)

你可以用几种方法来加快速度。一种方法是只数到√n而不是n本身,因为如果n有任何除数,那么这些除数中至少有一个是素数。有一个很酷的事实,一个数n的任何素数因子都不必大于√n、 所以你只需要数到√n、 包括在内。这会将您的运行时降低到0(√n) ,这是一个显著的进步

还有其他的算法可以用来进一步加速,但它们非常复杂,只对非常非常大的整数有用

您已经询问过如何将此时间降到O(1)。由于一个
int
中只能容纳有限多个可能的值,一个选项是构建一个包含所有适合
int
的素数的巨型表,将它们存储在哈希表中,然后在该表中查找有问题的数。它并不优雅,它是一个巨大的内存猪,但它会工作

根据您的用例,您可能还希望检查Eratosthenes筛,这将为您提供一种方法,在时间O(n)中计算所有质数,直到某个数字n,然后对该范围内的任何数字进行O(1)查询


希望这有帮助

让我们看看
for
循环(我们将忽略它执行的次数,并考虑最坏的情况):

在确定了这一点之后,如果你仔细观察,你会发现从
中点
开始,我们正在检查我们已经找到的东西,以防这个数字有任何除数。这是因为
X*Y==Y*X
(乘法是可交换的)。这意味着我们最多需要达到
X
,其中
X*X=NUMBER
,如果我们解这个方程,我们得到
X=square\u root(NUMBER)
,所以我们可以将循环切掉,直到
n
的平方根,我们应该没事了


这是一个巨大的挑战,谷歌在理解和解决这一问题上将非常有用。存在许多优化算法,但我写的优化是任何人都应该知道的常见优化。 祝你好运


据我所知,没有
O(1)
解决方案。直觉告诉你应该找不到一个。

让我们看看
for
循环(我们将忽略它执行了多少次,并考虑最坏的情况):

在确定了这一点之后,如果你仔细观察,你会发现从
中点
开始,我们正在检查我们已经找到的东西,以防这个数字有任何除数。这是因为
X*Y==Y*X
(乘法是可交换的)。这意味着我们最多需要达到
X
,其中
X*X=NUMBER
,如果我们解这个方程,我们得到
X=square\u root(NUMBER)
,所以我们可以将循环切掉,直到
n
的平方根,我们应该没事了


这是一个巨大的挑战,谷歌在理解和解决这一问题上将非常有用。存在许多优化算法,但我写的优化是任何人都应该知道的常见优化。 祝你好运


据我所知,没有
O(1)
解决方案。直觉告诉你应该找不到一个。

我想
n%2
应该是
n%I
。另外:你的方法被破坏了。你需要在条件中立即返回false,否则它只返回n-1%2的值,除此之外,sodik说的…@AmirAfghani你的建议会使它更快,但不会改变结果。我假设
n%2
应该是
n%I
。另外:你的方法被破坏了。你需要回来
public class PrimeNumbers {
    public boolean isPrime(int n) {
        boolean retValue = true;
        for (int i = 2; i < n; i++) {
            if (n % 2 == 0) {
                retValue = false;
            }
        }
        return retValue;
    }
}
        for (int i = 2; i < n; i++) { ...
2 * 18 = 36
3 * 12 = 36
4 * 9 = 36
6 * 6 = 36 # is the midpoint
9 * 4 = 36
12 * 3 = 36
18 * 2 = 36