Nombor Perdana oleh Eratosthenes Lebih Pantas Secara Berurutan daripada Serentak
Adakah anda ingin menjana nombor perdana dengan cekap menggunakan Ayakan Eratosthenes? Anehnya, pelaksanaan berurutan boleh menjadi lebih cepat daripada yang serentak. Artikel ini akan meneroka kemungkinan kesesakan dalam versi serentak dan menyediakan beberapa petua untuk mengoptimumkan kedua-dua pelaksanaan berurutan dan serentak.
Pelaksanaan Berjujukan
Pelaksanaan berurutan penapisan Eratosthenes adalah mudah:
- Mulakan tatasusunan boolean kepada benar untuk semua nilai sehingga nombor maksimum.
- Lelaran nombor dari 2 hingga punca kuasa dua nombor maksimum.
- Untuk setiap nombor p, potong semua gandaan p dengan menetapkan nilai yang sepadan dalam tatasusunan boolean kepada palsu.
- Cetak baki nombor yang masih ditetapkan kepada benar.
Pendekatan ini agak cekap, dengan kerumitan masa O(n log log n).
Pelaksanaan Serentak
Pelaksanaan serentak bertujuan untuk selarikan gelung luar, di mana kita mengulangi nombor dari 2 ke punca kuasa dua nombor maksimum. Anda boleh membahagikan julat kepada berbilang subjulat yang lebih kecil dan menetapkan setiap subjulat kepada urutan yang berbeza. Setiap urutan kemudiannya boleh memotong gandaan p dalam subjulatnya secara bebas.
Potensi Kesesakan dalam Pelaksanaan Serentak
Terdapat beberapa potensi kesesakan dalam pelaksanaan serentak:
-
Overhed Penyegerakan Benang: Setiap urutan perlu mengakses dan mengubah suai tatasusunan boolean yang dikongsi. Ini memerlukan primitif penyegerakan (cth., kunci atau operasi atom) untuk memastikan berbilang benang tidak cuba mengubah suai elemen yang sama secara serentak. Penyegerakan boleh memperkenalkan overhed yang ketara, terutamanya jika tatasusunan adalah besar.
-
Perkongsian Palsu: Benang mungkin ditugaskan kepada subjulat tatasusunan yang berdekatan dalam ingatan. Ini boleh membawa kepada perkongsian palsu, di mana urutan berbeza secara tidak sengaja mengakses talian cache yang sama, mengurangkan prestasi.
-
Selarian Terhad: Tahap selari dihadkan oleh bilangan pemproses yang tersedia. Jika bilangan maksimum tidak jauh lebih besar daripada bilangan pemproses, faedah selari mungkin minimum.
Petua untuk Pengoptimuman
Untuk mengoptimumkan kedua-dua urutan dan pelaksanaan serentak, pertimbangkan petua berikut:
-
Gunakan Struktur Data Khusus: Daripada menggunakan tatasusunan boolean, gunakan bitset atau struktur data penapis utama yang direka khusus untuk penjanaan nombor perdana yang cekap.
- Optimumkan Kawalan Gelung: Dalam pelaksanaan berjujukan, pertimbangkan untuk menggunakan Ayak Eratosthenes yang diubah suai yang hanya menandakan nombor yang boleh dibahagikan dengan faktor perdana pembilang gelung p.
-
Kurangkan Overhed Penyegerakan: Dalam pelaksanaan serentak, gunakan teknik penyegerakan yang terperinci seperti algoritma bebas kunci atau operasi atom untuk meminimumkan overhed mengakses data yang dikongsi.
-
Kurangkan Perkongsian Palsu: Pad pada tatasusunan boolean dengan memori tambahan untuk memastikan subjulat yang diperuntukkan kepada urutan berbeza disimpan dalam baris cache yang berbeza.
-
Tingkatkan Keselarian: Teroka kaedah untuk meningkatkan tahap keselarian, seperti menggunakan berbilang pemproses atau menggunakan kumpulan benang dengan bilangan utas yang lebih besar.
Kesimpulan
Walaupun pelaksanaan serentak Saringan Eratosthenes berpotensi mempercepatkan penjanaan nombor perdana, ia tidak selalunya lebih pantas daripada pelaksanaan berurutan kerana kemungkinan kesesakan. Dengan menangani kesesakan ini dengan teliti dan menggunakan teknik pengoptimuman, anda boleh meningkatkan prestasi pelaksanaan berurutan dan serentak.
Atas ialah kandungan terperinci Adakah Perlaksanaan Serentak Ayak Eratosthenes Sentiasa Lebih Cepat daripada Berurutan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!