Anda di halaman 1dari 7

UJIAN AKHIR SEMESTER

NAMA : FRANSISKA CHRISTINA SIO DA SILVA


NIM : 1908561001
KELAS : A
MATA KULIAH : DESAIN DAN ANALISIS ALGORITMA

Soal :
1) Jelaskan tentang algoritma Divide And Conquer dan berikan satu contoh permasalahan
dan penyelesaiannya menggunakan Algoritma tersebut?

2) Diketahui suatu data dengan 10 nilai yang tidak berurutan, data tersebut akan diurut
menaik dengan metode Merge Sort, tugas anda buat algoritma Merge Sort Tersebut dan
buat 10 nilai data yang akan diselesaikan dengan algoritma tersebut . Jelaskan
komleksitas pada algoritma Merge Sort ?

3) Diketahui sebuah teks : Tatik meminjami Tatia buku. Dicari pada indek keberapa
Patten Tatia mulai cocok pada teks tersebut diatas. Gambarkan proses pencarian
dengan menggunakan algoritma KMP dengan langkah berikut:

a) Buat algoritma fungsi pinggiran dan hitung fungsi pinggiran untuk pattern .

b) Buat algoritma KMP.

c) Gambarkan proses pencarian dan tentukan jumlah perbandingan yang


dilakukan.

Jawaban :
1) Algoritma Divide and Conquer merupakan algoritma yang sangat populer di dunia Ilmu
Komputer. Divide and Conquer merupakan algoritma yang berprinsip memecah-mecah
permasalahan yang terlalu besar menjadi beberapa bagian kecil sehingga lebih mudah
untuk diselesaikan. Langkah-langkah umum algoritma Divide and Conquer :

 Divide : Membagi masalah menjadi beberapa upa-masalah yang memiliki kemiripan


dengan masalah semula namun berukuran lebih kecil ( idealnya berukuran hampir sama ).

 Conquer : Memecahkan ( menyelesaikan ) masing-masing upa-masalah ( secara


rekursif ).

 Combine : Menggabungkan solusi masing-masing upa-masalah sehingga  membentuk


solusi masalah semula.
Objek masalah yang di bagi adalah masukan (input) atau instances yang berukuran n:
tabel (larik), matriks, dan sebagainya, bergantung pada masalahnya. Tiap-tiap upa-
masalah mempunyai karakteristik yang sama (the same type) dengan karakteristik
masalah asal, sehingga metode Divide and Conquer lebih natural diungkapkan dalam
skema rekursif. Sesuai dengan karakteristik pembagian dan pemecahan masalah tersebut,
maka algoritma ini dapat berjalan baik pada persoalan yang bertipe rekursif (perulangan
dengan memanggil dirinya sendiri). Dengan demikian, algoritma ini dapat
diimplementasikan dengan cara iteratif ( perulangan biasa ), karena pada prinsipnya
iteratif hampir sama dengan rekursif. Salah satu penggunaan algoritma ini yang paling
populer adalah dalam hal pengolahan data yang bertipe array ( elemen larik ). Mengapa ?
Karena pengolahan array pada umumnya selalu menggunakan prinsip rekursif atau
iteratif. Penggunaan secara spesifik adalah untuk mencari nilai minimal dan maksimal
serta untuk mengurutkan elemen array. Dalam hal pengurutan ini ada empat macam
algoritma pengurutan yang berdasar pada algoritma Divide and Conquer, yaitu merge
sort, insert sort, quick sort, dan selection sort. Merge sort dan Quick sort mempunyai
kompleksitas algoritma O(n ²log n). Hal ini lebih baik jika dibandingkan dengan
pengurutan biasa dengan menggunakan algoritma brute force.

Contoh permasalahan :

Binary search merupakan salah satu algoritma pencarian yang paling efisien, dengan
kompleksitas O(logn). Algoritma ini memanfaatkan teknik divide and conquer dengan
memecah lingkup pencarian data menjadi setengahnya pada setiap kali divide.
Kekurangan dari binary search yaitu bahwa algoritma ini hanya dapat digunakan pada
sebuah data atau lsit yang telah terurut.

def binary_search(data, search_val, min_idx, max_idx):


if max_idx < min_idx:
print("%d not found in list"%search_val)
return -1

mid_idx = (min_idx + max_idx) // 2


if data[mid_idx] > search_val:
return binary_search(data, search_val, min_idx, mid_idx - 1)
elif data[mid_idx] < search_val:
return binary_search(data, search_val, mid_idx + 1, max_idx)
else:
print("%d found in index %

Mari kita lihat cara kerja binary search. Misalkan kita diberikan data berupa list bilangan
seperti berikut: [1, 2, 4, 6, 7, 8, 9, 10] dan diminta untuk mencari letak angka 2 pada list
tersebut. Sebelum mulai menjalankan algoritma, pastinya kita harus mengetahui nilai-
nilai awal terelbih dahulu. Adapun nilai awal yang dibutuhkan untuk
fungsi binary_search adalah sebagai berikut:

data = [1, 2, 4, 6, 7, 8, 9, 10]

search_val = 2

min_idx =0

max_idx = len(data) - 1 # 7

Nilai indeks minimal (batas awal pencarian) yang pertama tentunya adalah 0, dengan
nilai maksimal (batas akhir pencarian) adalah ukuran dari list itu sendiri. Di langkah awal
binary search, dilakukan perhitungan terhadap nilai tengah
dari min_idx dan max_idx terlebih dahulu, untuk mendapatkan titik awal pencarian.
Perhitungan nilai tengah dilakukan pada kode berikut: mid_idx = (min_idx + max_idx) //
2

Setelah mendapatkan nilai tengah, kita lalu melakukan cek apakah nilai dari data pada
indeks tersebut lebih besar atau lebih kecil dibandingkan nilai yang akan kita cari (2).
Langkah pengecekan ini dilakukan pada perintah if berikut:

if data[mid_idx] > search_val:

# nilai lebih besar daripada 2

elif data[mid_idx] < search_val:

# nilai lebih kecil daripada 2

else:

# nilai adalah 2 (ditemukan)

Dalam kasus ini, nilai dari mid_idx adalah 3, dan karena data[3] berisi 6, maka kita akan
melakukan pemotongan terhadap seluruh nilai pada data setelah 6, karena nilai tersebut
sudah pasti tidak diperlukan lagi (ingat, data harus terurut pada binary search). Kita lalu
memanggil fungsi binary_search lagi, kali ini dengan mencari hanya pada submasalah
(list) berikut (perhatikan bagaimana pada pemanggilan binary_search yang kedua
nilai max_idx kita ubah menjadi mid_idx - 1): [1, 2, 4] Dan dengan mengaplikasikan
logika yang sama dengan tahap sebelumnya, kita akan langsung menemukan bilangan
yang dicari.
1. Misalnya diketahui table A yang berukuran n eleman sudah berisi nilai integer. Kita
ingin menentukan nilai minimum dan nilai maksimum sekaligus di dalam table
tersebut. Misalkan tabel A berisi elemen-elemen sebagai berikut :

Ide dasar algoritma secara Divide and Conquer :


Ukuran table hasil pembagian dapat dibuat cukup kecil sehingga mencari minimum
dan maksimum dapat diselesaikan (SOLVE) secara lebih mudah. Dalam hal ini,
ukuran kecil yang dipilih adalah 1 elemen atau 2 elemen.

ALGORITMA MIN DAN MAX

1. Untuk kasus n = 1 atau n = 2, SOLVE : Jika n = 1, maka min = maks = An. Jika n
= 2, maka bandingkan kedua elemen untuk menentukan min dan maks.

2. Untuk kasus n > 2,

 DIVIDE : Bagi dua table A secara rekursif menjadi dua bagian yang berukuran
sama, yaitu bagian kiri dan bagian kanan.
 CONQUER : Terapkan algoritma Divide and Conquer untuk masing-masing
bagian, dalam hal ini min dan maks dari table bagian kiri dinyatakan dalam
peubah min1 dan maks1, dan min dan maks dari table bagian kanan dinyatakan
dalam peubah min2 dan maks2.
 COMBINE : Bandingkan min1 dan min2 untuk menentukan min table A, serta
bandingkan maks1 dan maks2 untuk menentukan maks table A.

2) Contoh kasus 10 nilai data yang belum terurut:


Pada nilai data diatas merupakan nilai data yang belum terurut ,dan nantinya akan diurut
menaik dengan menggunakan motode merge short.
1. Pertama kali larik tersebut dibagi menjadi dua bagian, {6, 3, 5, 1,10} dan {8, 2, 4,
7,9}
2. Kedua larik kemudian diurutkan secara terpisah sehingga menjadi {6, 3}, {5, 1}, {10,
8}, dan {2,4},{7,9}
3. Ketiga larik kemudian diurutkan secara terpisah sehingga menjadi {6}, {3}, {5}, {1},
{10},{8}, {2}, {4}, {7} dan {9}
4. Sebuah larik baru dibentuk yang sebagai penggabungan dari setiap dua larik dan
diurutkan, sehingga masing-masing larik memilik nilai {3, 6}, {1, 5}, {8, 10}, dan
{2,4} dan {7,9}
5. Bentuk larik baru lagi yang merupakan penggabungan dari setiap dua larik dan
diurutkan, sehingga masing-masing lari memilik nilai {1, 3, 5, 6,10} dan {2, 4, 7,
8,9}
6. Langkah berikutnya adalah penggabungan dari masing-masing larik ke dalam larik
baru yang dibuat sebelumnya, sehingga memiliki nilai {1, 2, 4, 5, 6, 7, 8,9,10}

Algoritma Kompleksitas :
Proses penggabungan (merging) dilakukan antara sub-sub bagian dengan
memperhatikan urutan data yang diinginkan (ascending/kecil ke besar). Proses
penggabungan ini dilakukan sampai semua data tergabung dan terurut sesuai urutan
yang diiginkan. Kompleksitas algoritma merge sort adalah O(n log n).

Langkah kerja dari Merge sort :


1) Divide : Memilah elemen –elemen dari rangkaian data menjadi dua bagian
dan mengulangi pemilahan hingga satu elemen terdiri maksimal dua nilai.
2) Conquer : Mengurutkan masing-masing elemen.
3) Kombinasi : Mengkombinasikan dua bagian tersebut secara rekursif untuk
mendapatkan rangkaian data berurutan. Proses rekursi berhenti jika mencapai
elemen dasar. Hal ini terjadi bilamana bagian yang akan diurutkan
menyisakan tepat satu elemen. Sisa pengurutan satu elemen tersebut
menandakan bahwa bagian tersebut telah terurut sesuai rangkaian

Secara lebih rinci yaitu sebagai berikut :


1. void MergeSortRekursif(a, b)
2. jika (a<b) maka kerjakan baris 3-6
3. tengah = (a+b) / 2 ;
4. MergeSortRekursif(a,tengah);
5. MergeSortRekursif(tengah+1,b);
6. Merge(a,tengah,b);

3) a Algoritma pencarian string ini dapat juga diklasifikasikan menjadi 3 bagian menurut
arah pencariannya ,berikut ini adalah  algoritma yang termasuk dalam algoritma ini.

1. Dari arah yang paling alami yaitu dari kiri ke kanan, yang merupakan arah untuk
membaca, algoritma yang termasuk kategori ini adalah:

- Algoritma Brute Force.  Anda bisa membaca lebih detail tentang algoritma tersebut pada
judul artikel ini "Algoritma Brute Force"

- Algoritma dari Morris dan Pratt, yang kemudian dikembangkan oleh Knuth, Morris, dan
Pratt

2. Kategori kedua yaitu dari arah kanan ke kiri, arah yang biasanya menghasilkan hasil
terbaik secara praktikal, contohnya adalah:

- Algoritma dari Boyer dan Moore, yang kemudian banyak dikembangkan, menjadi
Algoritma turbo Boyer-Moore, Algoritma tuned Boyer-Moore, dan Algoritma Zhu-
Takaoka;

3. Dan kategori terakhir yaitu adalah dari arah yang ditentukan secara spesifik oleh
algoritma tersebut, arah ini menghasilkan hasil terbaik secara teoritis, algoritma yang
termasuk kategori ini adalah:

- Algoritma Colussi

- Algoritma Crochemore-Perrin
Teks     : Tatik meminjami Tatia buku

Pattern : atik

b. algoritma KMP

1. Tentukan teks yang digunakan sebagai input

2. Tentukan pola kata kunci yang digunakan dalam pencarian

3. Lakukan pencarian kata kunci menggunakan algoritma ini

c. s=0   atik

s=1    atik
s=2     atik
s=3      atik
s=4       atik
s=5        atik
s=6         atik
s=7          atik

Anda mungkin juga menyukai