1 BAB VIII MENGGABUNGKAN DUA VEKTOR (MERGING) Menggabungkan dua vektor merupakan operasi yang sering dimanfaatkan ketika kita mempunyai beberapa vektor dan kemudian ingin mendapatkan vektor baru yang memuat semua elemen dari sejumlah vekor tersebut. Operasi tersebut dinamakan penggabungan atau merging. Dalam penerapannya operasi penggabungan sering digunakan bersamaan dengan operasi-operasi lain untuk memenuhi berbagai macam kebutuhan data atau informasi, misal digabung operasi pengurutan dan pencarian data. Pada dasarnya terdapat tiga kemungkinan kondisi elemen-elemen data pada vektor –vektor yang akan digabungkan. Pada kondisi pertama, semua elemen data pada vektor-vektor yang akan digabung berada dalam kondisi urut, sedangkan pada kondisi kedua elemen-elemen vektor masih dalam kondisi acak. Namun demikian, dimungkinkan adanya variasi kondisi yang lain, yaitu sebagian vektor telah urut sedangkan yang lainnya masih acak. Ada baiknya bahwa sebelum dilakukan operasi penggabungan perlu dilakukan operasi pengurutan terlebih dahulu. Hal ini akan mempermudah ketika kita akan mengabungkannya kemudian. Pada kasus yang lain, untuk menggabungkan lebih dari dua vektor misalnya, maka dapat dilakukan dengan cara mengulang operasi penggabungan. Sebagai contoh jika kita akan mengabungkan tiga vektor yang masing-masing telah diurutkan, maka dapat dilakukan dengan cara menggabungkan vektor pertama dan vektor kedua terlebih dahulu. Akhir dari proses pada tahap ini akan menghasilkan sebuah vektor baru. Vektor tersebut kemudian digabungkan dengan vektor ketiga sehingga pada akhirnya akan diperoleh suatu vektor baru yang memuat semua elemen data pada tiga vektor yang dioperasikan. Terdapat dua metoda yang dapat digunakan untuk menggabungkan sejumlah vektor, yaitu penggabungan sederhana (simple merge) dan mailing list. Pembahasan bagian berikut ini akan meninjau tentang prosedur menggabungkan 2 dua buah vektor dengan metoda tersebut. Sebenarnya vektor yang akan digabungkan tidak harus berada dalam kondisi urut. Namun demikian, prosedur penggabungan akan menjadi sederhana dan mudah jika elemen-elemen dalam vektor-vektor yang akan digabungkan telah berada dalam kondisi urut, misal secara urut naik. 8.1. Penggabungan Sederhana (Simple Merge) Metoda paling umum digunakan untuk menggabungkan dua vektor adalah disebut metoda penggabungan sederhana (simple merge). Jika terdapat dua buah vektor, yaitu vektor A dan vektor B dan kedua vektor tersebut akan digabungkan menjadi vektor baru yang diberi nama vektor C. Jika cacah elemen vektor A dinyatakan dengan M dan cacah elemen vektor B dinyatakan dengan N, maka vektor C akan memiliki elemen sebanyak M+N. Dalam hal ini semua elemen dalam vektor A dan Vektor B akan dituliskan dalam vektor C. Operasi penggabungan dengan metoda penggabungan sederhana dengan cara menyisipkan setiap elemen vektor A ke dalam vektor B. Mula-mula bandingkan elemen pertama pada vektor A dengan elemen pertama pada vektor B. Jika elemen dari vektor A lebih kecil atau sama dengan elemen vektor B, maka akan ditempatkan pada urutan pertama dalam vektor C. Kemudian, elemen kedua pada vektor A dibandingkan dengan elemen pertama pada vektor B. Elemen yang lebih kecil selanjutnya akan menempati urutan kedua dalam vektor C. Sebaliknya, jika elemen pertama dari vektor B lebih kecil, maka elemen vektor B tersebut yang akan menempati urutan pertama dalam vektor C. Selanjutnya, elemen pertama dari vektor A akan dibandingkan dengan elemen kedua dari vektor B. Elemen yang lebih kecil kemudian akan ditempatkan pada urutan pertama dalam vektor C. Kemudian elemen pertama dari vektor A dibandingkan dengan elemen kedua dari vektor B. Elemen yang lebih kecil akan ditempatkan pada urutan kedua dalam vektor C. Proses tersebut akan dilakukan secara terusmenerus hingga semua elemen dalam vektor A dan semua elemen dalam vektor B selesai dipindahkan ke dalam vektor C. 3 Untuk lebih jelasnya, berikut ini diberikan contoh operasi penggabungan dua vektor yaitu vektor A dan vektor B yang masing-masing mempunyai elemenelemen sebagai berikut ini : Vektor A = 18 26 34 Vektor B = 21 26 27 36 40 Kedua vektor tersebut akan digabungkan menjadi sebuah vektor baru yang diberi nama vektor C, sehingga vektor C akan mempunyai 8 elemen data. Hasil operasi penggabungan pada vektor C tetap berada dalam urut naik. Langkah penggabungan kedua vektor tersebut dapat dijelaskan sebagai berikut ini. Mula-mula 18 dalam vektor A dibandingkan dengan 21 dari vektor B. Data yang lebih kecil yaitu 18, akan ditempatkan pada urutan pertama pada vektor C. Proses dilanjutkan untuk membandingkan 26 dalam vektor A dengan 21 dalam vektor B. Karena 21 lebih kecil dari 26, maka 21 ditempatkan pada posisi kedua dalam vektor C. Kemudian 26 dari vektor A dibandingkan dengan 26 dari vektor B. karena harganya sama, maka 26 dari vektor A akan ditempatkan pada urutan ketiga dalam C. Selanjutnya 34 dalam vektor A akan dibandingkan dengan 26 dari vektor B. Hasilnya, 26 dari vektor B akan ditempatkan pada urutan keempat dalam vektor C. Proses kemudian dilanjutkan untuk membandingkan kembali elemen-elemen dalam vektor A dengan elemen-elemen dalam vektor B untuk ditempatkan dalam vektor C hingga semua elemen selesai diproses. Pada akhirnya akan diperoleh hasil pada vektor C, yaitu sebagai berikut : Vektor C : 18 21 26 26 27 34 36 40 Elemen 26 pada urutan ketiga dalam vektor C adalah diperoleh dari elemen kedua dari vektor A, sedangkan elemen 26 pada urutan keempat dalam vektor C diperoleh dari elemen kedua dari vektor B. Langkah-langkah penggabungan vektor A dan vektor B menjadi vektor C dalam contoh di atas dapat ditelusuri sebagaimana ditunjukkan pada Tabel 8.1. Dalam tabel tersebut elemen tercetak tebal merupakan tanda bahwa elemen tersebut akan saling dibandingkan. 4 Sedangkan khusus pada langkah iterasi ke-6, elemen-elemen tercetak tebal merupakan sisa elemen-elemen yang harus dicopi-kan ke dalam vektor C. Solusi dalam bentuk algoritma prosedur untuk menggabungkan dua vektor dengan metoda penggabungan sederhana sebagaimana telah dijelaskan di atas dapat dituliskan berikut ini. Sedangkan flowchart prosedurnya ditunjukkan Gambar 8.1. Masukan vektor A dan B dengan cacah elemen masing-masing M dan N. Vektor A dan B telah diurutkan secara naik. Vektor C adalah gabungan vektor A dan vektor B dengan cacah elemen sebanyak M+N 1. Mulai 2. Inisialisasi I=1 J=1 K=1 3. Porses berulang untuk menggabungkan vektor A dan B menjadi vektor C FOR I = 1 TO M FOR J = 1 TO N Bandingkan elemen-elemen vektor A dan B dan tentukan elemen pada vektor C IF A[I] <= B[J] Jika ya, tentukan C[K[ = A[I] I=I+1 K=K+1 Jika tidak, tentukan C[K[ = B[I] J=J+1 K=K+1 4. Copi-kan sisa elemen yang tidak terproses ke dalam vektor C IF I > M Jika ya, copi-kan sisa elemen vektor B 5 FOR R = J TO N C[K] = B[R] K=K+1 Jika tidak, copi-kan sisa elemen vektor A FOR R = I TO M C[K] = A[R] K=K+1 5. Cetak hasil 6. Selesai Tabel 8.1 : Contoh menggabungkan dua vektor dengan metoda penggabungan sederhana Iterasi Vektor Hasi Proses ke: 1 2 3 4 5 6 A 18 26 34 B 21 26 27 C 18 A 18 26 34 B 21 26 27 C 18 21 A 18 26 34 B 21 26 27 C 18 21 26 A 18 26 34 B 21 26 27 C 18 21 26 26 A 18 26 34 36 40 B 21 26 27 C 18 21 26 26 27 A 18 26 34 36 40 B 21 26 27 C 18 21 26 26 27 36 40 36 40 36 40 36 40 34 36 40 6 Mulai Baca Vektor A, B I = 1, J = 1, K = 1 FOR I = 1 TO M FOR J = 1 TO N YA TIDAK A[I]<B[I] C[K] = A[I] I=I+1 K=K+1 C[K] = A[I] I=I+1 K=K+1 NEXT NEXT I YA TIDAK IF I > M FOR R=J TO N FOR R = 1 TO M C[K] = B[R] K=K+1 C[K] = A[R] K=K+1 NEXT J NEXT Cetak hasil Selesai Gambar 8.1 : Flowchart prosedur menggabung dua vektor dengan metoda penggabungan d h Dalam perkembangan lebih lanjut, metoda penggabungan sederhana merupakan dasar bagi pengembangan metoda pengurutan data yang dikenal dengan nama merge_sort. Metoda ini telah dibahas dalam Sub Bab 6.5 pada Bab VI. Pada prinsipnya merge_sort merupakan perulangan dari metoda penggabungan 7 sederhana. Dalam metoda tersebut setiap elemen dalam vektor yang digabungkan akan dianggap sebagai sebuah vektor. Artinya, masing-masing vektor hanya memiliki satu elemen data. Kemudian dengan menggunakan prosedur yang sama dengan metoda penggabungan sederhana masing-masing vektor tersebut akan digabungkan sehingga pada akhirnya diperoleh sebuah vektor baru yang urut. 8.2. Mailing List Dalam operasi penggabungan sering terjadi bahwa vektor-vektor yang akan digabungkan memiliki elemen yang sama, maka elemen yang sama tersebut hanya ingin dituliskan sekali saja dalam vektor hasil gabungannya. Permasalahan seperti ini dapat diselesaikan dengan beberapa cara. Salah satu cara sederhana yang dapat dilakukan adalah dengan menambahkan prosedur untuk pengecekan dan penggeseran elemen apabila ditemukan data yang sama. Prosedur tersebut ditambahkan setelah operasi penggabungan selesai dilakukan. Untuk melakukan prosedur tersebut diperlukan vektor bantuan untuk menampung vektor baru yang memuat elemen-elemen hasil penggabungan dikurangi elemen yang sama, missal vektor D. Cacah elemen dalam vektor D bisa jadi akan lebih sedikit dibandingkan vektor C, karena dalam vektor D elemen-elemen data yang sama hanya akan dituliskan satu kali saja. Dalam contoh sebelumnya, maka elemen 26 hanya akan dituliskan satu kali saja, sehingga cacah elemen pada vektor D sebanyak 7 buah. Hasil yang diperoleh adalah sebagai berikut : Vektor D : 18 21 26 27 34 36 40 Procedur pengecekan dan penggeseran elemen-elemen yang dilakukan pada vektor C untuk mendapatkan vektor D dapat dijelaskan sebagai berikut ini. Mulamula dibandingkan elemen pertama dengan elemen kedua dalam vektor C. Jika tidak sama, maka elemen pertama dalam vektor C akan ditempatkan pada 8 urutan pertama dalam vektor D. Selanjutnya bandingkan elemen pertama dalam vektor D dengan elemen kedua dalam vektor C. Jika tidak sama, maka elemen kedua dalam vektor C akan ditempatkan pada urutan kedua dalam vektor D. Kemudian bandingkan elemen kedua dalam vektor D dengan elemen ketiga dalam vektor C. Jika tidak sama, maka pindahkan elemen ketiga dalam vektor C ke dalam vektor D. Proses seperti ini akan dilakukan secara terus-menerus hingga semua elemen dalam vektor C selesai dipindahkan ke dalam vektor D. Jika ditemukan elemen yang sama, maka elemen tersebut tidak boleh dipindahkan ke dalam vektor D. Solusi dalam bentuk algoritma untuk prosedur tersebut dapat dituliskan sebagai berikut ini. Masukan vektor A dan B dengan cacah elemen masing-masing sebanyak M dan N. Vektor A dan B telah diurutkan secara naik. Vektor C adalah hasil gabungan vektor A dan vektor B dengan cacah elemen sebanyak M+N Vektor D adalah hasil gabungan vektor A dan vektor B tanpa ada elemen yang sama. 1. Mulai 2. Inisialisasikan harga-harga awal I=1 J=1 K=1 3. Proses berulang untuk menggabungkan vektor A dan B menjadi vektor C FOR I = 1 TO M FOR J = 1 TO N Bandingkan elemen-elemen vektor A dan B dan tentukan elemen pada vektor C IF A[I] <= B[J] Jika ya, tentukan C[K] = A[I] I=I+1 K=K+1 Jika tidak, tentukan 9 C[K] = B[J] J=J+1 K=K+1 4. Copi-kan sisa elemen yang tidak terproses ke dalam vektor C IF I > M Jika ya, copi-kan sisa elemen vektor B FOR R = J TO N C[K] = B[R] K=K+1 Jika tidak, copi-kan sisa elemen vektor A FOR R = I TO M C[K] = A[R] K=K+1 5. Tentukan D[1] = C[1] I=2 K=1 6. Bandingkan elemen-elemen vektor D dan C dan tentukan elemen pada vektor D IF C[I] <> D[K] Jika ya, tentukan K=K+1 D[K] = C[I] 7. Tentukan I=I+1 8. Cek nilai I IF I < N + M Jika ya, kembali ke langkah-6 9. Cetak hasil 10. selesai Cara lain untuk menyelesaikan permasalahan seperti di atas adalah dengan menerapkan metoda mailing list. Caranya, jika ditemukan elemen-elemen data yang sama, maka hanya salah satu elemen saja yang akan ditempatkan pada 10 vektor C sebagai vektor hasil. Sedangkan elemen lain yang sama tidak perlu diproses. Hal ini dapat dilakukan dengan cara menaikkan harga pencacah (counter) pada vektor A dan vektor B secara bersamaan. Dengan cara demikian, maka elemen-elemen data yang sama hanya akan muncul sekali pada vektor hasil penggabungannya. Secara lebih terinci, algoritma prosedur penggabungan dua vektor dengan metoda mailing list adalah dituliskan sebagai berikut ini. Masukan vektor A dan B dengan cacah elemen masing-masing sebanyak M dan N. Vektor A dan B telah diurutkan secara naik. Vektor C adalah hasil gabungan vektor A dan vektor B tanpa ada elemen yang sama. 1. Mulai 2. Inisialisasikan harga-harga awal I= 1 J=1 K=1 3. Proses berulang untuk menggabung vektor-vektor A dan B menjadi vektor C FOR I = 1 TO M FOR J = 1 TO N Bandingkan elemen-elemen vektor A dengan elemen-elemen vektor B IF A[I] < B[J] Jika ya, tntukan elemen pada vektor C C[K] = A[I] I=I+1 K=K+1 Jika tidak, cek kembali IF A[I] > B[J] Jika ya, tentukan elemen pada vektor C C[K] = A[J] J=J+1 K=K+1 Jika tidak, tentukan elemen vektor C C[K] = A[I] atau C[K] = B[J] 11 I=I+1 J=J+1 K=K+1 4. Copi-kan sisa elemen yang tidak terproses ke dalam vektor C IF I > M Jika ya, copi-kan sia elemen yang tidak terproses ke dalam vektor C FOR R = J TO N C[K] = B[R] K=K+1 Jika tidak, copi-kan sisa elemen vektor A ke dalam vektor C FOR R = I TO M C[K] = A[r] K=K+1 5. Cetak hasil 6. Selesai Sampai pada bagian ini, dua metoda penggabungan dua vektor yaitu simple merge dan mailing list telah ditinjau. Keduanya dapat diterapkan dalam aplikasiaplikasi yang memerlukan operasi penggabungan. Namun, jika diperlukan kita dapat melakukan modifikasi untuk mengoptimalkan performance prosedur sesuai dengan kondisi datanya. Sekali lagi, bahwa prosedur yang ditulis di atas menuntut vektor-vektor yang akan digabungkan harus berada dalam kondisi urut naik. Jika vektor-vektor berada dalam kondisi urut turun, maka prosedur di atas tinggal dibalik saja. Namun apabila vektor-vektor masih acak, maka akan lebih baik jika diurutkan terlebih dahulu.