Halo teman-teman, apa kabar? Kali ini saya ingin membahas sedikit tentang salah satu problem yang ada di web rosalind.info. Judulnya ialah "Enumerating Gene Orders". Sebagai acuan, teman-teman bisa cek dahulu problem yang akan kita bahas (disini).
Di problem ini kita akan disajikan sebuah integer (sebut saja n) yang mewakili jumlah set angka yang masing-masing berbeda (contoh, 5 = [1, 2, 3, 4, dan 5]). Tugas kita ialah menemukan jumlah total permutasi yang bisa dibentuk dari set tersebut dan menyebutkan semua permutasinya.
Untuk pengerjaan, pertama kita cari jumlah total permutasi menggunakan rumus faktorial n.
Kemudian, untuk menyebutkan permutasinya, kita bisa menggunakan algoritma permutasi. Untuk lebih ditailnya, teman-teman bisa melihat referensi video yang ada disini.
Berikut kode pengerjaannya dalam bahasa java :
- static void nextPermutaion (int n, int[] arr) {
- for (int x : arr) {
- out.print(x + " ");
- }
- out.println();
- while (true) {
- int por = n - 2;
- while (por >= 0 && arr[por] >= arr[por + 1]) {
- por--;
- }
- if (por < 0) {
- return;
- }
- for (int i = n - 1; i > por; i--) {
- if (arr[i] > arr[por]) {
- int swap = arr[por];
- arr[por] = arr[i];
- arr[i] = swap;
- break;
- }
- }
- for (int i = por + 1; i < (n + por + 1) / 2; i++) {
- int swap = arr[i];
- arr[i] = arr[n - 1 - (i - (por + 1))];
- arr[n - 1 - (i - (por + 1))] = swap;
- }
- for (int x : arr) {
- out.print(x + " ");
- }
- out.println();
- }
- }
- static int factorial (int n) {
- int res = 1;
- for (int i = 1; i <= n; i++) {
- res *= i;
- }
- return res;
- }
- static void solve() {
- int n = ni();
- int[] arr = new int[n];
- for (int i = 0; i < n; i++) {
- arr[i] = i + 1;
- }
- out.println(factorial(n));
- nextPermutaion(n, arr);
- }
Kita mulai dari baris ke 40 (static void solve()).
Seperti yang sudah dijelaskan, pertama kita mencari jumlah permutasi menggunakan rumus faktorial n (baris 33-39).
Setelah itu, kita lanjutkan dengan menyebutkan semua permutasinya menggunakan algoritma permutasi (baris 1-32). Algoritma ini mirip dengan heap sort dan heap's algorithm: secara umum, kita hanya menukar-nukar angka di set tersebut dan mendapatkan semua permutasinya. Untuk lebih detailnya, teman-teman bisa membaca tentang heap's algorithm terlebih dahulu.
Seperti yang teman-teman lihat; disini, saya memakai fungsi ni() (baris 11) untuk meng-input data integer. Fungsi tersebut adalah extend dari salah satu sistem input di java, yaitu BufferedReader.
Sedangkan untuk output-nya saya memakai fungsi out.println() (baris 46). Fungsi tersebut juga adalah modifikasi dari fungsi System.out.println() yang merupakan fungsi default di java. Untuk lebih jelasnya, teman-teman bisa melihat kode tambahan untuk memodifikasi fungsi tersebut (input maupun output) di versi lengkap kode saya di github.
Sekian dari saya. Jika teman-teman ingin menanyakan sesuatu, teman-teman bisa menulisnya di kolom komentar. Semoga bermanfaat dan sampai jumpa di artikel berikutnya!
Referensi :
Sumber gambar 1 :https://www.facebook.com/ProjectRosalind/
No comments:
Post a Comment