tôi đã viết đoạn mã sau để có được tất cả các số nguyên tố từ 2..Ntính số (suối và lambdas) Thủ
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)
);
}
tôi tối ưu hóa nó bằng cách kiểm tra trong khoảng 2..sqrt (n) và lọc ra các số chẵn, nhưng bây giờ tôi muốn tối ưu hóa nó hơn bằng cách lưu trữ tất cả các số nguyên tố đã tìm thấy trước đây (tôi không quan tâm đến bộ nhớ), để tôi có thể lọc ra các số chia hết cho các số nguyên tố đó, chứ không phải bởi 2. Tôi biết có những giải pháp tốt hơn, nhưng nó chỉ là một bài tập về lambdas và suối.
Tôi tin rằng việc tối ưu hóa tốt hơn là (a) thay đổi từ noneMatch() để anyMatch() và phủ nhận kết quả (b) Các hoạt động lọc bạn có thực sự là rất hạn chế để kiểm tra nếu số trong phạm vi giữa 2..sqrt (đầu vào) chia hết cho 2 và không kiểm tra các số nguyên tố khác như 3,5 .... Thay vì tất cả các bước này làm cho luồng trở lại ngay sau khi số có thể chia hết cho các 2,3,4,5, .... – Baski
@Baski: tại sao bạn nghĩ rằng thay đổi từ 'noneMatch()' thành 'anyMatch()' và phủ nhận kết quả nào tối ưu hóa bất cứ điều gì? – Holger
Nếu bạn muốn tối ưu hóa tốc độ với chi phí bộ nhớ, hãy thực hiện sàng của Eratosthenes bằng cách sử dụng 'BitSet'. Nhưng, vì đây là một bài tập trong các luồng, bạn có thể sử dụng 'getPrimesStream' bên trong' isPrime' để có được các thừa số chính để kiểm tra: 'return number == 2 || getPrimesStream ((dài) ceil (sqrt (số))). noneMatch (số chia -> số% số chia == 0); ' – Misha