Ben 2..Nhesaplama asal sayılar (dere ve lambda'lar)
private static LongStream getPrimesStream(long number) {
return LongStream.range(2, number + 1)
.filter(PrimeStreamTest::isPrime);
}
private static boolean isPrime(final long number) {
return number == 2 || (number % 2 != 0 && LongStream
.range(2, (long) Math.ceil(Math.sqrt(number + 1)))
.filter(n -> n % 2 != 0)
.noneMatch(divisor -> number % divisor == 0)
);
}
Ben 2..sqrt aralığında kontrol ederek bunu optimize tüm asal sayılarını almak için aşağıdaki kodu yazdım (n) ve çift sayıları filtrelemek, ama şimdi daha önceden bulunan tüm primleri (bellek umurumda değil) saklayarak onu daha da optimize etmek istiyorum, böylece bu primerler tarafından bölünebilen sayıları filtreleyebilirim, ve sadece bölünebilenleri değil 2 Daha iyi çözümler olduğunu biliyorum, ama sadece lambda ve akışlar üzerinde bir alıştırma.
daha iyi optimizasyon anyMatch (hiç noneMatch() (a) değişikliğe olduğuna inanıyoruz denemek ve (b) sahip filtre işlemi gerçekten çok olmadığını kontrol sınırlıdır sonucu etkisiz hale 2..sqrt (giriş) aralığındaki sayı 2'ye bölünür ve 3,5 gibi diğer asal sayıları kontrol etmez. Tüm bu adımlar yerine akış, sayıyı bölündüğü anda geri döndürür. 2,3,4,5, .... – Baski
@Baski: Neden noneMatch() 'den' anyMatch() 'ye geçmeyi ve sonucun olumsuzluğu değiştirdiğini düşünüyorsunuz? – Holger
Hız için bellek maliyetini optimize etmek istiyorsanız, Eratosthenes'in elekini bir "BitSet" kullanarak uygulayın. Ancak, bu akışlarda bir alıştırma olduğu için, karşı test etmek için ana faktörleri almak için 'isPrime' içinde' getPrimesStream' kullanabilirsiniz: 'return number == 2 || getPrimesStream ((uzun) ceil (sqrt (sayı)). noneMatch (divisor -> number% divisor == 0); – Misha