Dimungkinkan untuk menyelesaikan ini secara relatif efisien dengan menghitung semua gcd berpasangan, menghapus duplikat, dan kemudian berulang. Ini tindakan menghapus duplikat sebelum Anda berulang yang membuatnya efisien.
Saya akan menjelaskan algoritma lebih terinci di bawah ini, tetapi pertama-tama, ini membantu untuk mendefinisikan operator biner . Jika adalah himpunan bilangan bulat positif, tentukanS , T⊗S,T
S⊗T={gcd(s,t):s∈S,t∈T}.
Perhatikan bahwadan (dalam masalah Anda); biasanya, akan lebih kecil daripada yang disarankan, yang membantu membuat algoritma menjadi efisien. Perhatikan juga bahwa kita dapat menghitung denganoperasi gcd dengan penghitungan sederhana.| S ⊗ T | ≤ 10 9 S ⊗ T S ⊗ T | S | × | T ||S⊗T|≤|S|×|T||S⊗T|≤109S⊗TS⊗T|S|×|T|
Dengan notasi itu, berikut adalah algoritma. Biarkan menjadi set input angka. Hitung , lalu , lalu , dan seterusnya. Temukan terkecil sehingga tetapi . Maka Anda tahu bahwa ukuran subset terkecil seperti itu adalah . Jika Anda juga ingin menampilkan contoh konkret dari subset seperti itu, dengan mempertahankan back-pointer Anda dapat dengan mudah merekonstruksi set tersebut.S 2 = S 1 ⊗ S 1 S 3 = S 1 ⊗ S 2 S 4 = S 1 ⊗ S 3 k 1 ∈ S k 1 ∉ S k - 1 kS1S2=S1⊗S1S3=S1⊗S2S4=S1⊗S3k1∈Sk1∉Sk−1k
Ini akan relatif efisien, karena tidak ada set perantara tumbuh dalam ukuran di atas (pada kenyataannya, ukurannya mungkin akan jauh lebih kecil dari itu), dan waktu berjalan membutuhkan sekitar operasi gcd. 500 × ( | S 1 | + | S 2 | + ⋯ )109500×(|S1|+|S2|+⋯)
Berikut ini adalah pengoptimalan yang mungkin meningkatkan efisiensi lebih jauh. Pada dasarnya, Anda dapat menggunakan penggandaan iterated untuk menemukan terkecil sehingga . Khususnya, untuk setiap elemen , kami melacak subset terkecil dari yang gcdnya dan yang ukurannya . (Ketika Anda menghapus duplikat, Anda menyelesaikan ikatan yang mendukung subset yang lebih kecil.) Sekarang, daripada menghitung urutan sembilan set , kami malah menghitung urutan lima set , dengan menghitung , lalu , lalu1 ∈ S k x ∈ S i S 1 x ≤ i S 1 , S 2 , S 3 , S 4 , … , S 9 S 1 , S 2 , S 4 , S 8 , S 9 S 2 = S 1 ⊗ S 1 S 4 = S 2 ⊗ S 2 Sk1∈Skx∈SiS1x≤iS1,S2,S3,S4,…,S9S1,S2,S4,S8,S9S2=S1⊗S1S4=S2⊗S2S 9 = S 1 × S 8 k ∈ [ 1 , 2 , 4 , 8 , 9 ] 1 ∈ S k k 1 ∈ S k 1 1 S k 1 ∈ S kS8=S4⊗S4 , lalu . Saat Anda mulai, cari pertama sedemikian sehingga . Setelah Anda menemukan sedemikian sehingga , Anda dapat segera berhenti: Anda dapat menemukan subset terkecil yang gcdnya dengan melihat subset yang terkait dengan . Jadi, Anda dapat berhenti segera setelah mencapai set sedemikian rupa sehingga , yang memungkinkan Anda untuk berhenti lebih awal jika Anda menemukan subset yang lebih kecil.S9=S1×S8k∈[1,2,4,8,9]1∈Skk1∈Sk11Sk1∈Sk
Ini harus efisien waktu dan efisien ruang. Untuk menghemat ruang, untuk setiap elemen , Anda tidak perlu menyimpan seluruh set: cukup untuk menyimpan dua backpointers (jadi dua elemen yang Anda ambil gcd dari, untuk mendapatkan ) dan secara opsional ukuran subset yang sesuai.S i , S j xx∈SkSi,Sjx
Pada prinsipnya, Anda dapat mengganti urutan dengan rantai tambahan lainnya . Saya tidak tahu apakah beberapa rantai tambahan lain akan lebih baik. Pilihan optimal mungkin tergantung pada distribusi jawaban yang benar dan ukuran yang diharapkan dari set , yang tidak jelas bagi saya, tetapi mungkin dapat diturunkan secara empiris melalui eksperimen.S k[1,2,4,8,9]Sk
Penghargaan: Terima kasih saya kepada KWillets untuk gagasan menyimpan subset angka bersama dengan setiap elemen , yang memungkinkan penghentian lebih awal.Si