Saya meninjau kembali masalah lama yang saya kerjakan beberapa waktu lalu.
Skenario khas adalah "3 bit diatur dalam integer 8 bit", yaitu 00000111.
Semua kombinasi unik dengan 3 set bit dapat dengan mudah dihasilkan (dalam urutan) oleh loop bersarang. Yang saya tertarik adalah kombinasi pemetaan indeks <->, yaitu "00001011" akan menjadi kombinasi kedua (atau nilai "1" dalam indeks berbasis nol).
Sejauh ini, saya menjalankan semua kombinasi dan menyimpannya dalam sebuah tabel, menjadikan indeks pencarian -> percakapan sebagai operasi O (1). Arah lainnya adalah O (ln (n)) dengan pencarian dua bagian.
Kelemahannya adalah, ini jelas sangat berat pada memori jika kita meningkatkan domain, sampai pada titik di mana itu tidak layak.
Apa yang akan menjadi cara sederhana untuk menghitung kombinasi ke-n atau indeks untuk kombinasi yang diberikan? Urutan kombinasi akan menyenangkan, tetapi tidak wajib.
Jawaban:
Menghasilkan kombinasi ke-n disebut algoritma "unranking". Perhatikan bahwa permutasi dan kombinasi sering dapat disamakan dengan cara masalah parameternya. Tanpa tahu persis apa masalahnya, sulit untuk merekomendasikan pendekatan yang tepat, dan pada kenyataannya, untuk sebagian besar masalah kombinatorik biasanya ada beberapa algoritma peringkat / penguraian kemungkinan yang berbeda.
Salah satu sumber yang bagus adalah "Algoritma Combinatorial" oleh Kreher dan Stinson. Buku ini memiliki banyak algoritma peringkat dan unranking yang baik dijelaskan dengan jelas. Ada sumber daya yang lebih maju, tetapi saya akan merekomendasikan Kreher sebagai titik awal. Sebagai contoh algoritma unranking pertimbangkan hal berikut:
Ini adalah permutasi unranking, tetapi seperti yang disebutkan di atas, dalam banyak kasus Anda dapat mengubah kombinasi unranking menjadi masalah permutasi yang setara.
sumber