【问题标题】:Java Prime Numbers from 1 to N slow, improving efficiency?Java素数从1到N慢,提高效率?
【发布时间】:2018-03-02 19:00:29
【问题描述】:

我正在开发一个程序,该程序从用户那里获取一个上限,然后使用一种方法来计算从 1 到 N 的所有素数。我有一个可行的解决方案,但我的脑袋一直在烦我效率太低了。

 public ArrayList<Integer> primeNumbers()
{
    long startTime = System.nanoTime();
    ArrayList<Integer> prime = new ArrayList<Integer>();
    ArrayList<Integer> factorList;
    for (int i = 2; i <= this.limit; i+=1)
    {
        factorList = factors(i);
        if (factorList.size() == 2 && factorList.contains(1) && factorList.contains(i))
        {
            prime.add(i);
        }
    }
    long endTime = System.nanoTime();
    long totalTime = endTime - startTime;
    System.out.println("The total time was: " + totalTime);
    return prime;

}

public ArrayList<Integer> factors(int i)
{
    ArrayList<Integer> factor = new ArrayList<Integer>();

    for (int a = 1; a <= i; a+=1)
    {
        for (int b = 1; b<=i; b+=1)
        {
            if (a*b == i)
            {
                if (factor.contains(a) == false)
                     factor.add(a);
                if (factor.contains(b) == false)
                     factor.add(b);
            }
        }
    }
    return factor;
}

虽然上面的代码可以运行,但似乎运行起来很慢

this.limit

值高于 3500。关于如何提高效率的任何想法,或者我只是偏执?帮助表示赞赏。

【问题讨论】:

标签: java performance primes


【解决方案1】:

您的实现效率非常低,因为它是整数参数大小的二次方。

寻找例如https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes 以提高复杂性。

【讨论】:

    【解决方案2】:

    我会看看是否有不同的方法来分解一个数字,在您的实现中,您将 3 个 for 循环嵌套在彼此内部。 how to factor a number java 可能会有所帮助

    【讨论】:

      【解决方案3】:

      这是埃拉托色尼筛的 Java 实现:

      public static LinkedList sieve(int n)
      {
          BitSet b = new BitSet(n);
          LinkedList ps = new LinkedList();
      
          b.set(0,n);
      
          for (int p=2; p<n; p++)
          {
              if (b.get(p))
              {
                  ps.add(p);
                  for (int i=p+p; i<n; i+=p)
                  {
                      b.clear(i);
                  }
              }
          }
      
          return ps;
      }
      

      我在my blog 讨论这个函数。

      【讨论】:

      • 请在这里讨论,至少一点点。
      猜你喜欢
      • 1970-01-01
      • 2014-11-09
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多