Tampilkan postingan dengan label Algoritma. Tampilkan semua postingan
Tampilkan postingan dengan label Algoritma. Tampilkan semua postingan

Rabu, 07 Desember 2016

Depth-First Search dengan Stack




DFS atau Depth-First Search merupakan metode penelusuran struktur graf/pohon secara mendalam. Pada setiap iterasi , algoritma berlanjut untuk titik yang belum dikunjungi, yang berdekatan dengan titik dimana algoritma sedang berlangsung. Proses ini berlangsung hingga mencapai jalan buntu/pencarian sudah tidak bisa kemana-mana lagi, kondisi ini terjadi ketika titik yang tidak memiliki titik berdekatan yang belum dikunjungi telah ditemui.
Kita dapat menggunakan stack untuk melacark operasi depth-first search, dengan mem-push simpul pada stack ketika simpul dikunjungi untuk pertama kalinya. Lalu kita mem-pop simpul tersebut jika pada simpul tersebut sudah tidak bisa kemana-mana lagi/buntu. Selain itu juga kita dapat membuat depth-first search forest, simpul awal graf traversal berfungsi sebagai akar dari pohon pertama dalam hutan.

Berikut merupakan proses penelusuran dfs dengan menggunakan stack

a.  Pertama kita tandai semua simpul dengan 0, artinya simpul tersebut belum dikunjungi.
b.    Masukkan simpul a ke dalam stack, dari simpul a (anggap a adalah parent) kita berlanjut ke simpul anak dari a yaitu c dan masukkan c ke dalam stack, dari simpul c kita lanjut ke simpul d dan simpul d dimasukkan ke dalam stack.
c.   Simpul d sudah tidak memiliki anak lagi, dan d berada dikondisi jalan buntu. Sehingga pada stack yang pertama kita keluarkan yaitu d. Dari d akan kembali ke c dan disimpul c kita mengecek apakah ada anak dari c? Ternyata ada, yaitu simpul f. Simpul f dimasukan ke dalam stack, dari simpul f kita melakukan penelusuran kembali, kita melihat bahwa ada anak dari simpul f yaitu b. Simpul b kita masukan ke dalam stack, dari simpul b penelusuran masih berlanjut karena masih ada simpul yang belum dikunjungi, yaitu simpul e. Simpul e kita masukan ke dalam stack, setelah itu c sudah tidak memiliki anak lagi dan berada dalam kondisi jalan buntu, sehingga di stack ini kita mem-pop e, setelah itu pop b, pop f, pop c, dan terakhir pop a.
d.  Pada graf selanjutnya kita lakukan hal seperti tadi yaitu kita tandai semua simpul dengan 0 yang berarti belum pernah dikunjungi.
e.   Kita mulai dari simpul g sebagai parent. Simpul g kita masukan ke dalam stack, selanjutnya lakukan penelusuran dari simpul g ke simpul anaknya yaitu h, h kita masukan ke dalam stack, dari h kia lakukan penulusuran kembali sehingga kita push i ke dalam stack, dan yang terakhir push j ke dalam stack.
f.   Karena pada simpul j sudah jalan buntu maka kita pop j, pop i, pop , dan terakhir pop g.

Jika dalam stack sudah kosong maka pencarian telah selesai dan hasil ditemukan.
Berikut merupakan hasil dari DFS tadi:
A-C-D-F-B-E-G-H-I-J.

Dalam DFS ini terdapat dua kali pengurutan yang ditandai dengan angka seperti gambar diatas. Angka yang berhimpitan dengan simpul itu merupakan urutan saat simpul itu dimasukkan (push). Dan angka yang berada disebelah kanan nya merupakan urutan pengeluaran (pop) simpul pada stack tadi.

Referensi: Buku Introduction to The Design and Analysis of Algorithms

Jumat, 02 Desember 2016

Algoritma Binary Search Ilustration


Algoritma pencarian bagidua atau yang disebut binary search.  Merupakan algoritma pencarian pada data terurut yang paling efficient. Dikatakan efficient karena dalam penggunaannya algoritma ini membutuhkan waktu pencarian yang cepat.
Sebagai contoh saya akan membahas tentang algoritma pencarian pada data terurut menurun dengan binary search.
Diasumsikan elemen-elemen larik sudah terurut dari besar ke kecil, selama pencarian kita memerlukan dua buah indeks larik, disini saya menggunakan larik a untuk menyebut indeks ujung kiri dan b untuk indeks ujung kanan. Pertama kita inisialisasi a dengan 1 dan b dengan n.
Langkah pertama yaitu bagi kedua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks k=(a+b) div 2. Selanjutnya periksa apakah L[k]=x. L merupakan nama lariknya, jika L[k]=x, pencarian berhenti atau selesai karena x sudah ditemukan. Tetapi jika L[k]≠x, kita harus menentukan apakah pencarian akan dilakukan dilarik bagian kiri atau dibagian kanan. Jika L[k]<x, maka pencarian dilakukan pada larik bagian kiri, begitu sebaliknya jika L[k]>x, pencarian dilakukan lagi pada larik bagian kanan. Lalu ulangi langkah 1 hingga x ditemukan atau a>b (ukuran larik sudah nol).
Berikut ilustrasi binary search: dimisalkan ada larik L dengan delapan buah elemen yang sudah terurut menurun
9
7
6
4
3
2
1
a=1            2                    3                    4                    5                    6                        b=7
Langkah I:
Kita bagi larik L menjadi dua bagian dengan cara a=1 dan b=7, k=(1+7) div 2 = 4

9
7
6
4
3
2
1
a=1                  2                    3                    4                    5                    6                        b=7
Misalkan elemen yang dicari adalah x = 6.
Langkah II: Bandingkan L[4] dengan 6, apakah L[4]=6 ? Tidak, maka dari itu kita harus menentukan apakah pencarian akan dilakukan di bagian kiri atau dibagian kanan dengan pemeriksaan sebagai berikut: karena L[4]<6 maka pencarian dilakukan pada bagian kiri dengan a=1 dan b=3
9
7
6
a=1                                    2                                  b=3
                                    kiri

Langkah III: Pembagian a=1 dan b=3, k=(1+3) div 2 = 2.
9
7
6
a=1                                    2                                  b=7
            kiri                                                       kanan
Langkah IV: lakukan pemandingan kembali antara L[2] dengan 6, ternyata L[2]>6 sehingga pencarian dilakukan pada larik bagian kanan dengan a=7 dan b=7.
6
        a=b=7

Langkah V: pembagian a=7 dan b=7, k=(7+7) div 2 = 7.
6
            7
Langkah VI: bandingkan L[7] dengan 6, apakah L[7]=6 ? Ya ! Pencarian selesai, x ditemukan.

Jumat, 11 November 2016

Contoh Algoritma Menentukan Indeks Nilai Mahasiswa

Menentukan indeks nilai mahasiswa dalam post saya ini yaitu dengan membuat sebuah algoritma yang membaca nama mahasiswa nilai ujian dan indeksnya.
Adapun nilai indeks yang telah ditentukan dari nilai ujian yang diraih mahasiswa adalah sebagai berikut:
(i)   jika nilai ujian ≥ 80, indeks nilai = A
(ii)  jika 70 ≤ nilai ujian < 80, indeks nilai = B
(iii) jika 55 ≤ nilai ujian < 70, indeks nilai = C
(iv) jika 40 ≤ nilai ujian < 55, indek nilai = D
(v)  jika nilai ujian < 40, indeks nilai = E

Berikut merupakan bentuk algoritma dari data tersebut:
PROGRAM IndeksNilai
{Menghitung indeks nilai ujian mahasiswa}

DEKLARASI:
nama : string
nilai : real
indeks : char

ALGORITMA:
read(nama,nilai)
if nilai ≥ 80 then
   indeks ← 'A'
else
 if(nilai ≥ 70) and (nilai < 80) then
     indeks ← 'B'
 else
  if(nilai ≥ 55) and (nilai < 70) then
      indeks ← 'C'
  else
   if(nilai ≥ 40) and (nilai < 55) then
       indeks ← 'D'
   else
        indeks ← 'E'
   end if
  end if
 end if
end if
write(nama,nilai,indeks)

Nah itu merupakan contoh algoritma menentukan indeks yang diperoleh mahasiswa melalui nilai ujiannya. Semoga bermanfaat ^^

Sumber: Buku Algoritma dan Pemrograman dalam Bahasa C, C++, dan Pascal Edisi Keenam (Penerbit Informatika)