Bab 7 : Carian Carian / gelintaran proses untuk memeriksa satu atau serangkaian unsur untuk mendapatkan data yang dicari proses untuk menentukan sama ada suatu unsur itu ahli kpd suatu set cubaan untuk mencari rekod di dalam fail Setiap rekod mempunyai: a) medan data b) medan kekunci - kekunci sekumpulan aksara @ nombornombor yg digunakan sebagai pengenal rekod (contoh: nombor I/C, nombor pekerja dan sbgnya). Tujuan : untuk mencapai maklumat yang telah disimpan. Jadual 1 menunjukkan contoh sebuah fail pekerja. NoPekerja NoKadPengenalan Nama Jawatan 1111 701111-11-1234 Ahmad Faiz Azhar Pengaturcara 122 800202-02-2323 Mohd. Azim Mohd. Razi Kerani 211 811003-03-3134 Nurina Raidah Abdul Aziz Juruanalisa Sistem Jadual 1: Rekod pekerja Teknik carian juga perlu untuk mencari penyelesaian kepada suatu masalah. Dalam AI, carian adalah proses untuk memilih satu penyelesaian daripada beberapa kemungkinan penyelesaian. Di antara teknik carian yang popular ialah : o carian berjujukan atau carian linear o carian perduaan atau carian binari o carian pohon perduaan atau carian pohon binari o cincangan dan pengindeksan - carian bagi jumlah data yang besar Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 1 )
Cincangan adalah teknik menguruskan data dalam fail. Contoh : untuk menentukan lokasi setiap rekod yang berada dalam satu jadual berdasarkan medan kekunci. Ia adalah teknik carian terus ke dalam fail berasaskan kekunci rekod dengan memetakan nilai kekunci kpd rekod dalam fail. Pengindeksan adalah kaedah untuk aplikasi berasaskan cakera. Teknik carian ini menggabungkan ciri-ciri kebaikan pada teknik carian berjujukan dan cincangan. Pengindeksan adalah teknik carian berstruktur bagi mencapai rekod yang disimpan dalam fail jujukan berindeks. Dalam teknik ini, fail terbahagi kepada tiga kawasan utama iaitu kawasan indeks, kawasan storan data dan kawasan limpahan. Alamat rekod-rekod disimpan ditempatkan dalam kawasan indeks bagi fail berkenaan. Teknik ini membenarkan nilai kekunci yang sama lebih dari satu. 7.1 Carian Berjujukan Kaedah carian ini digunakan untuk mencari data dalam senarai / jadual, iaitu implimentasi tts atau senarai berpaut. Setiap unsur dalam senarai akan disemak satu persatu secara berjujukan, bermula daripada unsur pertama sehingga unsur terakhir atau unsur yang dikehendaki ditemui. Carian berjujukan adalah cara termudah tetapi lambat kerana ia membandingkan kekunci yang dicari dengan setiap unsur dalam senarai. Carian dianggap berjaya apabila kekunci yang dicari sepadan dengan kekunci dalam senarai. Jika tiada kekunci yang sepadan, maka proses carian akan diteruskan sehingga ke unsur senarai yang terakhir dan carian dianggap gagal. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 2 )
void carian::berjujukan (jenis_data kekunci_carian, int saiz_tatasusunan, const senarai_eleman tatasusunan[], char status[], int *indeks ) { //Pembolehubah setempat int p; strcpy(status, GAGAL ); //Nilai awal status carian *indeks = -1; //Nilai awal indeks tatasusunan for (p = 0; p < saiz_tatasusunan; p++) { if (kekunci_carian == tatasusunan[p]) { *indeks = p; //Umpukan indeks tatasusunan terkini strcpy(status, BERJAYA ); //Menukar status break; // end if // end for Atur cara 1: Fungsi carian. Gelung for akan berulang sehingga : o data yang dikehendaki ditemui atau o kursor sampai ke unsur tts yang terakhir. Jika nilai yang dicari berada pada unsur yang kedua, maka gelung carian berulang sebanyak 2 kali. Jika nilai yang dikehendaki berada pada elemen terakhir atau nilai tersebut tiada dalam senarai unsur, maka gelung for akan berulang mengikut bilangan unsur atau saiz tatasusunan. Bagi jumlah rekod yang besar, kaedah ini memakan masa yang lama kerana kekunci carian akan semua unsur senarai. Satu cara yang boleh mengurangkan masa carian, ialah dengan menyimpan data dalam senarai yang terisih. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 3 )
Rajah 2 menunjukkan carian menggunakan fungsi carian. Nilai yang dicari (kekunci_carian) = 22 dan saiz tts = 5. 1 2 3 tatasusunan 11 33 22 55 44 tatasusunan 11 33 22 55 44 tatasusunan 11 33 22 55 44 Nilai awalan bagi pembolehubah status, indeks dan unsur tatasusunan Laluan gelung = 1 Kekunci_carian akan indeks pertama tatasusunan Laluan gelung = 2 Kekunci_carian akan indeks kedua tatasusunan 4 status BERJAYA indeks 2 tatasusunan 11 33 22 55 44 Rajah 1: Gambaran perlaksanaan fungsi carian Laluan gelung = 3 Kekunci_carian indeks ketiga tatasusunan Kekunci yang dicari ditemui Status bertukar kepada BERJAYA Ulangan gelung dihentikan dengan penyata break Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 4 )
7.3 Carian Berjujukan Dari Senarai Terisih Kecekapan algoritma carian berjujukan boleh ditingkatkan dengan menggunakan senarai terisih. Kekunci carian akan unsur senarai sehingga : o kekunci yang dicari ditemui atau o nilai kekunci yang dicari lebih kecil dari unsur senarai terkini (jika unsur senarai diisih secara menaik). Kriteria ini penting kerana ia boleh menjimatkan masa larian aturcara dengan mengurangkan bilangan ulangan gelung jika kekunci yang dicari tiada dalam senarai. void carian::berjujukan_terisih (jenis_data kekunci_carian, int saiz_tatasusunan, const senarai_eleman tatasusunan[], char status[], int *indeks ) { int p; //Pembolehubah setempat strcpy(status, GAGAL ); //Nilai awal status carian *indeks = -1; //Nilai awal bagi indeks tts for (p = 0; p < saiz_tatasusunan; p++) { if (kekunci_carian < tatasusunan[p]) break;//gelung dihentikan apabila //nilai kekunci carian lebih //kecil dari nilai elemen semasa tts else if (kekunci_carian == tatasusunan[p]) { *indeks = p; //Umpukan indeks tts terkini strcpy(status, BERJAYA ); //Menukar status break; Atur cara 2: Fungsi carian bagi senarai Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 5 )
Rajah 3 menunjukkan perlaksanaan fungsi carian bagi senarai terisih (Atur cara 2). Nilai yang dicari kekunci_carian = 25 dan saiz tatasusunan = 5. 1 2 3 tatasusunan 11 22 33 44 55 kekunci_carian 25 tatasusunan 11 22 33 44 55 kekunci_carian 25 tatasusunan 11 22 33 44 55 Nilai awalan bagi pembolehubah status, indeks dan elemen tatasusunan Laluan gelung = 1 Kekunci_carian akan indeks pertama tatasusunan Laluan gelung = 2 Kekunci_carian akan indeks kedua tatasusunan kekunci_carian 25 4 indeks 2 tatasusunan 11 22 33 44 55 kekunci_carian 25 Laluan gelung = 3 Kekunci_carian indeks ketiga tatasusunan Nilai kekunci_carian lebih kecil dari unsur tatasusunan Ulangan gelung dihentikan dengan penyata break Rajah 2: Gambaran perlaksanaan fungsi carian pada senarai terisih. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 6 )
Dalam perlaksanaan Aturcara 2, jika senarai tidak terisih, gelung akan berulang mengikut bilangan unsur senarai. Dalam kes Rajah 2, jika senarai tidak terisih, gelung berulang sebanyak 5 kali. Oleh kerana senarai tersebut telah diisih secara menaik, ulangan gelung hanya 3 tiga kali. Jika senarai yang diisih secara menurun, kita hanya perlu menukarkan operator lebih kecil < kepada operator lebih besar > pada penyataan for. 7.4 Carian Perduaan Carian Perduaan : carian bagi senarai terisih Bermula dgn perbandingan kekunci yang dicari dgn unsur tengah senarai (indeks tengah tts, indeks = TENGAH) Jika nilai sepadan, carian berjaya. Jika kekunci yang dicari < unsur tengah senarai, carian menumpu kpd unsur2 di antara unsur pertama sehingga unsur sebelum unsur tengah senarai (TENGAH - 1). Unsur2 lain (di antara TENGAH + 1 hingga indeks terakhir) diabaikan Jika kekunci yang dicari belum ditemui, dapatkan indeks TENGAH kedua (unsur tengah di antara unsur pertama dgn unsur TENGAH 1). Bandingkan dgn kekunci yg dicari, jika nilainya lebih besar, carian menumpu kpd unsur2 di antara TENGAH kedua dgn TENGAH pertama Proses ini berulang sehingga unsur yang dicari ditemui atau carian sampai kpd unsur terakhir dlm subset yg direntasi. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 7 )
Kekunci_carian 35 Senarai_Tatasusunan 11 22 33 44 55 66 77 Rajah 3: Senarai unsur terisih. Rajah 3 menunjukkan senarai yang terisih secara menaik. Carian perduaan bermula dengan mendapatkan indeks TENGAH bagi senarai. Andaikan kekunci_carian = 35. TENGAH = (0 + 6) / 2 = 3 {Indeks TENGAH yang pertama Kekunci_carian (35) unsur pada indeks ke 3 dalam senarai tatasusunan (44). Oleh kerana nilai kekunci_carian < TENGAH, maka carian menumpu kepada unsur-unsur di antara indeks ke-1 dan indeks ke-3 (indeks pertama hingga TENGAH - 1). Unsur-unsur pada indeks ke-5 dan ke-7 diabaikan (indeks TENGAH + 1 hingga indeks terakhir). Proses untuk mendapatkan indeks TENGAH dilakukan sekali lagi kerana nilai yang dicari belum ditemui dan belum mencapai elemen terakhir subset yang direntasi. TENGAH = (0 + 2) / 2 = 1 {Indeks TENGAH yang kedua Kekunci_carian akan unsur pada indeks ke 1 (22). Oleh kerana nilai kekunci_carian > TENGAH, maka carian akan menumpu kepada unsur-unsur di antara indeks TENGAH yang pertama dan indeks TENGAH yang kedua sahaja, iaitu indeks ke 2 dalam senarai tatasusunan. TENGAH = (2 + 2) / 2 = 2 {Indeks TENGAH yang ketiga Unsur pada indeks ketiga dalam senarai tatasusunan adalah tidak setara dengan nilai kekunci carian. Sedangkan, proses carian telah sampai ke unsur terakhir dalam senarai. Oleh itu proses carian ditamatkan dan carian ini dianggap gagal. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 8 )
void carian_perduaan (jenis_data kekunci_carian, int saiz_tatasusunan, const senarai_eleman atasusunan[], char status[], int *indeks) { int TENGAH, KIRI, KANAN; strcpy(status, GAGAL ); //Nilai awal status carian *indeks = -1; KIRI = 0; KANAN = saiz_tatasusunan 1; while ((KIRI <= KANAN) && (strcmp(status, GAGAL ) == 0)) { //Mendapatkan indeks tengah TENGAH = (KIRI + KANAN) / 2; if (tatasusunan[tengah] == kekunci_carian) { *indeks = TENGAH; strcpy(status, BERJAYA ); else if (tatasusunan[tengah] > kekunci_carian) KANAN = TENGAH 1; //Carian disebelah kiri senarai else KIRI = TENGAH + 1; //Carian disebelah kanan senarai Atur cara 3: Carian perduaan bagi tts yang diisih secara menaik. Rajah 4 menunjukkan perlaksanaan fungsi perduaan Aturcara 3. Nilai yang dicari (kekunci_carian) = 22 dan saiz tts = 10. Untuk mendapatkan senarai yang diisih secara menaik, operator lebih besar > perlu ditukar kepada operator lebih kecil < seperti berikut, : else if (tatasusunan[tengah] > kekunci_carian) KANAN = TENGAH 1; : Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 9 )
1 [5] [6] [7] [8] [9] tatasusunan 12 14 16 18 20 22 24 26 28 30 KIRI KIRI 0 KANAN 9 TENGAH 4 TENGAH KANAN 2 [5] [6] [7] [8] [9] tatasusunan 12 14 16 18 20 22 24 26 28 30 KIRI 5 KIRI TENGAH KANAN KANAN 9 TENGAH 7 3 [5] [6] [7] [8] [9] tatasusunan 12 14 16 18 20 22 24 26 28 30 KIRI 5 KIRI TENGAH KANAN KANAN 6 TENGAH 5 Rajah 4: Jujukan perlaksanaan carian perduaan. Disediakan oleh: Zalmiyah Zakaria, FSKSM, UTM ( m/s: 10 )