簡體   English   中英

哪種Eratosthenes篩網實施效率更高?

[英]Which Sieve of Eratosthenes implementation is more efficient?

我有兩種Eratosthenes篩子的實現。 這是第一個:

public class SieveOfEratosthenes extends PrimeGenerator {

    private boolean[] sieve;
    private List<Integer> primes;

    public SieveOfEratosthenes(int depth) {
        super(depth);

        sieve = new boolean[depth + 1];
        primes = new ArrayList<>();

        generate();
    }

    private void setPrime(int n) {
        sieve[n] = true;
        primes.add(n);
    }

    private void generate() {
        setPrime(2);
        setPrime(3);

        for (int n = 4; n <= depth; n++) {
            boolean isPrime = true;

            for (int prime : primes) 
                if (n % prime == 0) 
                    isPrime = false;

            if (isPrime)
                setPrime(n);
        }
    }
}

這是第二個。

public boolean[] sieve(int n)
{
   boolean[] prime=new boolean[n+1];
   Arrays.fill(prime,true);
   prime[0]=false;
   prime[1]=false;
   int m=Math.sqrt(n);

   for (int i=2; i<=m; i++)
      if (prime[i])
         for (int k=i*i; k<=n; k+=i)
            prime[k]=false;

   return prime;
} 

顯然,第二個則不那么冗長。 這並不是要成為主要生成器層次結構的一部分。 但是我的問題是,哪個更有效? 第一個似乎是O(N * log(N)),但我不確定。 我不確定第二年的增長率是多少。

第二個更有效率。 它也是Eratosthenes的篩子。 第一種算法是試驗分割,而不是 Eratosthenes篩。

第一種算法的時間復雜度為O( n sqrt( n )),或者,如果僅使用質數作為試驗除數,則可能會少一些。 第二種算法的時間復雜度為O( n log log n ),由於log log n非常小,因此幾乎是線性的。

作為實驗,計算前一百萬個素數,直到15485863,然后看哪個更快。 它甚至不會接近。 第二種算法將在幾秒鍾內完成。 第一個算法將花費幾個小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM