[英]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.