ALGORITMA ANALISIS
ALGORITMA ANALISIS Walangi, S.T. Thoyyibah. T. S. Kom. M. Kom. Rinna Rachmatika, S. Kom. M. Kom.
ALGORITMA ANALISIS Copyright© PT Penamudamedia, 2024 Penulis: Walangi, S.T., Thoyyibah. T. S. Kom. M. Kom., Rinna Rachmatika, S. Kom. M. Kom. ISBN: 978-623-09-7598-1 Desain Sampul: Tim PT Penamuda Media Tata Letak: Enbookdesign Diterbitkan Oleh PT Penamuda Media Casa Sidoarium RT 03 Ngentak, Sidoarium Dodeam Sleman Yogyakarta HP/Whatsapp : +6285700592256 Email : [email protected] Web : www.penamuda.com Instagram : @penamudamedia Cetakan Pertama, Januari 2024 viii+ 88, 15x23 cm Hak cipta dilindungi oleh undang-undang Dilarang memperbanyak sebagian atau seluruh isi buku tanpa izin Penerbit
v Kata Pengantar uji syukur kami panjatkan kehadirat Tuhan Yang Maha Esa karena kami dapat menyelesaikan buku ini. Penyusunan buku ini bertujuan untuk memenuhi tugas. Selain itu, penyusunan buku ini juga bertujuan untuk menambah wawasan mengenai “Algoritma Analisis”. Kami juga mengucapkan terima kasih kepada semua pihak yang terkait telah membimbing dan memberikan support sehingga penyusunan buku ini terselesaikan. Buku ini terdiri beberapa bab, dimana setiap bab terdapat contoh soal terkait dengan algoritma. Akhirnya kami menyadari bahwa buku ini sangat jauh dari kesempurnaan. Oleh karena itu, dengan segala kerendahan hati, kami menerima kritik dan saran agar penyusunan buku selanjutnya menjadi lebih baik. Untuk itu kami mengucapkan banyak terima kasih dan semoga karya tulis ini bermanfaat untuk kami dan untuk pembaca. P
vi Daftar Isi KATA PENGANTAR ...................................................................... v DAFTAR ISI ........................................................................................ vi BAB I. REKURSIF ........................................................................... 1 A. Pengertian Rekursif ...............................................................2 B. Jenis-Jenis Rekursif ...............................................................2 C. Komponen Penting Rekursif.............................................3 D. Manfaat dan Keuntungan Penggunaan Rekursif .............................................................................................................3 E. Kapan Rekursif Digunakan dalam Pemrograman?......................................................................... 4 F. Iterasi (Perulangan) vs Rekursif ................................... 4 G. Kapan Menggunakan Iterasi dan Kapan Menggunakan Rekursif ? .................................................. 4 H. Program dan Penyelesaian Rekursif..........................5
vii BAB II. DIVIDE AND CONQUE ....................................... 13 A. Pengertian Algoritma Divide and Conquer........14 B. Skema Umum Algoritma Divide and Conquer.. 15 C. Algoritma Merge Sort........................................................ 17 D. Contoh Persoalan yang Dapat Diselesaikan dengan Divide and Conquer.......................................20 BAB III. DYNAMIC PROGRAMMING DAN GREEDY .......................................................................... 29 A. Dynamic Programming.....................................................30 B. Algoritma Greedy................................................................33 C. Persamaan Dynamic Programming dan Greedy Algorithm...................................................................................35 D. Perbedaan Dynamic Programming dan Greedy Algorithm...................................................................................37 E. Penggunaan Dynamic Programming dan Greedy Algorithm...................................................................................38 F. Penggunaan Greedy Algorithm.................................39 BAB IV. ALGORITME BACKTRACKING ................. 41 A. Exhaustive Search ............................................................. 42 B. Traversal Graf...................................................................... 42 C. Backtracking...........................................................................45 D. Family of Five within Thirty Seconds Problem47
viii E. Penggunaan Algoritma backtracking.................... 48 BAB V. TEORI P, NP, dan NP-COMPLETE .......... 61 A. Perbandingan Polynomial-time algorithm dan nonpolynomial-time algorithm....................................62 B. Perbandingan Tractable dan Intractable Problem ......................................................................................63 C. Perbandingan Solvable dan Unsolvable Problem ......................................................................................63 D. Algoritma Deterministik .................................................. 64 E. Algoritma Non-Deterministik ........................................65 F. Persoalan Keputusan........................................................68 G. P Problems...............................................................................68 H. NP Problem..............................................................................68 I. Algoritma-Algoritma Pendekatan.............................82 DAFTAR PUSTAKA ................................................................ 85 TENTANG PENULIS ............................................................ 88
1 Tujuan Pembelajaran
2 Fungsi rekursif adalah proses di mana suatu fungsi memanggil dirinya sendiri secara langsung atau tidak langsung. Dengan menggunakan algoritma rekursif, masalah tertentu dapat diselesaikan dengan cukup mudah. Dapat membantu dalam memecahkan masalah dengan memecahkannya menjadi kasus yang lebih kecil. Maka dari itu penggunaan fungsi ini dapat membantu mengurangi jumlah kode yang dibutuhkan serta memudahkan untuk dibaca. 1. Rekursif Langsung Rekursif Langsung, terjadi ketika sebuah fungsi memanggil dirinya sendiri secara langsung dalam tubuh fungsi itu sendiri. Dalam hal ini, pemanggilan rekursif adalah langkah terakhir dalam fungsi sebelum mengembalikan hasil atau memanggil fungsi itu sendiri kembali. Pada umumnya, ini menghasilkan pemanggilan berurutan dari fungsi yang sama. 2. Rekursif Tidak Langsung Rekursif Tidak Langsung, terjadi ketika dua atau lebih fungsi saling memanggil satu sama lain dalam urutan tertentu untuk menyelesaikan tugas tertentu. Dalam rekursi tidak langsung, fungsi pertama memanggil fungsi kedua, yang kemudian dapat
3 memanggil fungsi pertama atau fungsi ketiga, dan seterusnya. Algoritma rekursif memiliki dua komponen utama yang sangat penting: 1. Kasus Basis (Base Case): Ini adalah kondisi di mana fungsi rekursif berhenti memanggil dirinya sendiri dan mengembalikan hasil tertentu. Kasus basis sangat penting untuk menghindari terjadinya pemanggilan fungsi yang tak terbatas (infinite recursion). 2. Langkah Rekursif (Recursive Step): Ini adalah bagian dari fungsi yang memanggil dirinya sendiri dengan argumen yang berbeda untuk mendekati kasus basis. Tujuannya adalah untuk memecah masalah menjadi sub-masalah yang lebih kecil. 1. Kemampuan untuk menyelesaikan masalah yang kompleks dengan cara yang lebih elegan. 2. Pemisahan masalah besar menjadi masalah kecil yang lebih mudah dipecahkan. 3. Reusabilitas kode, di mana fungsi rekursif dapat digunakan dalam berbagai konteks. 4. Peningkatan pemahaman dan pemeliharaan kode yang lebih mudah bagi programmer yang memahami rekursif.
4 Rekursif digunakan dalam pemrograman ketika: 1. Masalah dapat diuraikan menjadi submasalah yang serupa dengan masalah asli. 2. Fungsi atau prosedur dapat memanggil dirinya sendiri dengan argumen yang berbeda. 3. Base case dapat didefinisikan untuk menghentikan rekursi dan menghasilkan hasil akhir. Gambar 1.1 Iterasi (Perulangan) vs Rekursif Pemilihan antara iterasi (perulangan) dan rekursif tergantung pada sifat masalah dan preferensi desain. Rekursif digunakan ketika masalah dapat diuraikan menjadi submasalah yang serupa, sedangkan iterasi digunakan untuk perulangan tugas yang sama tanpa pemanggilan diri sendiri. Pemilihan tergantung pada kompleksitas masalah, keterbacaan kode, dan efisiensi.
5 1. Rekursif Langsung a. Faktorial: Faktorial dari suatu bilangan n (ditulis sebagai n!) adalah hasil perkalian semua bilangan bulat positif dari 1 hingga n. Gambar 1.2 Rumus Faktorial Gambar 1.3 Implementasi faktorial dengan Python b. Fibonacci: Deret Fibonacci adalah deret bilangan di mana setiap elemen adalah jumlah dari dua elemen sebelumnya. Barisan fibonacci 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … dapat dinyatakan secara rekursif sebagai berikut:
6 Gambar 1.4 Rumus Fibonacci Gambar 1.5 Implementasi Fibonacci dengan python c. Hanoi Tower (Menara Hanoi): Masalah menara Hanoi melibatkan pemindahan cincin-cincin dari satu tumpukan ke tumpukan lain dengan bantuan tumpukan ketiga sebagai tumpukan sementara. Gambar 1.6 Cara kerja hanoi tower
7 Gambar 1.7 Implementasi Hanoi Tower dengan python d. Penjelajahan Pohon (Tree Traversal): Dalam struktur data pohon, Anda dapat melakukan penjelajahan berbeda seperti in-order, preorder, dan post-order traversal menggunakan rekursif. Hasil Gambar 1.8 Cara kerja Tree Traversal
8 Gambar 1.9 Implementasi Tree Traversal dengan python 2. Rekursif Tidak Langsung a. Pencarian String (sub-string): Dapat digunakan untuk mencari keberadaan suatu substring dalam sebuah string dengan membagi string menjadi sub-string yang lebih kecil dan membandingkan sub-string tersebut dengan substring yang dicari. Pencarian sub-string dalam teks “Hello World!” Gambar 1.10 Implementasi Pencarian string dengan python
9 b. Pengurutan (Sort): Algoritma pengurutan seperti merge sort atau heap sort dapat diimplementasikan menggunakan rekursi tidak langsung. Mengurutkan (sort) dari daftar angka: 38, 27, 43, 3, 9, 82, 10 Gambar 1.11 Implementasi pengurutan dengan python c. Travel Graf: Algoritma perjalanan graf seperti algoritma Travelling Salesman Problem (TSP), untuk mencari jalur terpendek yang melewati semua
10 simpul dengan membandingkan berbagai jalur yang mungkin. Travel Graf dengan Matriks jarak antar titik: [0, 10, 15, 20], [10, 0, 35, 25], [15, 35, 0, 30], [20, 25, 30, 0] Gambar 1.12 Implementasi travel graf dengan python Hasil
11 d. Search Linked List: Dalam pemrosesan daftar terhubung, seperti daftar terhubung ganda atau daftar terhubung sirkular, dapat digunakan untuk memproses atau mencari elemen-elemen tertentu dalam daftar. Melakukan pencarian dari daftar linked list node, dengan targer nilai yang ingin dicari adalah: 3, 6, 1 Gambar 1.13 Implementasi Search Linked List dengan python
12
13 Tujuan Pembelajaran
14 Algoritma Divide and Conquer adalah metode pemecahan suatu masalah dengan cara membagi masalah tersebut menjadi beberapa sub-masalah yang lebih kecil dan serupa dengan masalah awal, sehingga dapat diselesaikan lebih mudah. Setelah itu, solusi dari setiap sub-masalah akan digabungkan untuk membentuk solusi dari masalah asli. 1. Divide Membagi persoalan menjadi beberapa upapersoalan yang memiliki kemiripan dengan persoalan semula namun berukuran lebih kecil (idealnya berukuran hamper sama). 2. Conquer Menyelesaikan masing-masing upa-persoalan (secara langsung jika sudah berukuran lebih kecil atau secara rekursif jika masih berukuran besar). 3. Combine Menggabungkan solusi masing-masing upa-persoalan sehingga membentuk solusi persoalan semula. Gambar 2. 1 Algoritma Divide and Conquer
15 Gambar 2. 2 Bagan Flow Divide and Conquer Gambar 2. 3 Skema Umum Algoritma Divide and Conquer Penjelasan :
16 T(n) : kompleksitas waktu penyelesaian persoalan P yang berukuran n g(n) : kompleksitas waktu untuk SOLVE jika n sudah berukuran kecil 1 + 2 … + : kompleksitas waktu untuk memproses setiap upa-persoalan f(n) : kompleksitas waktu untuk COMBINE solusi dari masing-masing upa-persoalan Jika pembagian selalu menghasilkan dua upapersoalan yang berukuran sama : Gambar 2. 4 Skema Alternatif Algoritma Divide and Conquer
17 Merge Sort adalah algoritma pengurutan data yang mengadopsi pendekatan “Divide and Conquer” atau “bagi dan taklukkan”. Gambar 2. 5 Merge Sort Artinya, algoritma ini membagi masalah pengurutan menjadi beberapa sub masalah yang lebih kecil, mengurutkan masing-masing sub-masalah secara terpisah, dan kemudian menggabungkan hasilnya menjadi satu keseluruhan data yang terurut dengan benar. Contoh menggunakan data Array = {38, 27, 43, 10} Awalnya bagilah array menjadi dua bagian yang
18 sama: Subarray ini selanjutnya dibagi menjadi dua bagian. Sekarang menjadi satuan array yang tidak dapat lagi dibagi dan satuan array selalu terurut. Subarray yang diurutkan ini digabungkan menjadi satu, dan kita mendapatkan subarray yang diurutkan lebih besar. Proses penggabungan ini dilanjutkan hingga array yang diurutkan dibangun dari subarray yang lebih kecil.
19 Contoh Merge Sort pada Program Phyton : Gambar 2. 6 Implementasi Merge Sort pada Program Phyton
20 1. Persoalan MiniMaks : Mencari Nilai Minimum dan Maksimum Permasalahan : Misalkan diberikan sebuah larik A yang berukuran n elemen dan sudah berisi nilai integer. Carilah nilai minimum (min) dan nilai maksimum (max) sekaligus di dalam larik tersebut. a. Penyelesaian dengan menggunakan Algoritma Brute Force Gambar 2. 7 Algoritma Brute Force min = 1 max = 35
21 Jumlah perbandingan elemen larik : T(n) = (n – 1) + (n – 1) = 2n – 2 = O(n) b. Penyelesaian dengan menggunakan Algoritma Divide and Conquer Ide dasar secara Divide and Conquer : 1) Ukuran larik hasil pembagian dapat dibuat cukup kecil sehingga mencari minimum dan maksimum dapat diselesaikan (SOLVE) secara trivial. 2) Dalam hal ini, ukuran “kecil” yang didefinisikan apabila larik hanya berisi 1 elemen atau 2 elemen. Algoritma: a) Untuk kasus n = 1 atau n = 2, SOLVE: Jika n = 1, maka min = maks = A[n] Jika n = 2, maka bandingkan kedua elemen untuk menentukan min dan maks
22 b) Untuk kasus n > 2, (a) DIVIDE: Bagi dua larik A menjadi dua bagian yang sama, A1 dan A2 (b) CONQUER: MinMaks(A1, n/2, min1, maks1) MinMaks(A2, n/2, min2, maks2) (c)COMBINE: if min1 < min2 then min ← min1 else min ← min if maks1 < maks2 then maks ← maks2 else maks ← maks1 Mencari nilai minimum dan maksimum di dalam larik berikut :
23 Kompleksitas waktu algoritma minmaks, dihitung dari jumlah operasi perbandingan elemen-elemen larik : Penyelesaian: Asumsi: n = 2k, dengan k bilangan bulat positif, maka T(n) = 2T(n/2) + 2 = 2(2T(n/4) + 2) + 2 = 4T(n/4) + 4 + 2 = 4T(2T(n/8) + 2) + 4 + 2 = 8T(n/8) + 8 + 4 + 2 = ...
24 = 2k – 1 T(2) + ∑ 2i = 2k – 1 ⋅ 1 + 2k – 2 = n/2 + n – 2 = 3n/2 – 2 = O(n) 2. Perbandingan : a. MinMaks1 secara brute force : T(n) = 2n – 2 b. MinMaks2 secara divide and conquer: T(n) = 3n/2 – 2 a. Perhatikan bahwa 3n/2 – 2 < 2n – 2 untuk n ≥ 2. c. Kesimpulan: persoalan MinMaks lebih sangkil diselesaikan dengan algoritma Divide and Conquer. d. Moral dari contoh ini adalah bahwa algoritma divide and conquer dapat membantu kita menghasilkan algoritma yang sangkil. 3. Perpangkatan an Misalkan a ∈ R dan n adalah bilangan bulat tidak negatif, maka perpangkatan a n didefinisikan sebagai berikut: Bagaimana algoritma menghitung perpangkatan a n secara brute force dan secara divide and conquer?
25 • Penyelesaian dengan Brute Force : Kompleksitas algoritma, dihitung dari jumlah operasi perkalian: T(n) = n = O(n) • Penyelesaian dengan Divide and Conquer Ide dasar: bagi dua pangkat n menjadi n = n/2 + n/2 an = a(n/2 + n/2) = an/2 ⋅ an/2 Algoritma divide and conquer untuk menghitung a n : 1) Untuk kasus n = 0, maka a n = 1. 2) Untuk kasus n > 0, bedakan menjadi dua kasus lagi: (a) jika n genap, maka a n = a n/2 ⋅ a n/2 (b) jika n ganjil, maka a n = a n/2 ⋅ a n/2 ⋅ a
26 4. Mengevaluasi Pohon Ekspresi Di dalam compiler bahasa pemrograman, ekspresi aritmetika direpresentasikan dalam pohon biner yaitu pohon ekspresi (expression tree). Contoh: (5 + 7) / (8 - 2) * (4 ^ 2) Mengevaluasi pohon ekspresi artinya menghitung nilai ekspresi aritmetika yang dinyatakannya. Contoh: (5 + 7) / (8 – 2) * (4 ^ 2) = 32 Algoritma Divide and Conquer Gambar 2.8 Pohon Ekspresi Gambar 2.9 Penyelesaian dengan pohon ekspresi
27 Misalkan pohon ekspresi direpresentasikan dengan senarai berkait (linked list). Simpul daun operand, contoh: 4, –2, 0, dst Simpul dalam operator, contoh: +, -, *, /, ^ Struktur setiap simpul: info: operand atau operator Pada simpul daun left = NIL dan right = NIL Algoritma divide and conquer: If simpul adalah daun then return info else secara rekursif evaluasi upa-pohon kiri dan return nilainya secara rekursif evaluasi upa-pohon kanan dan return nilainya gabungkan kedua nilai tersebut sesuai dengan operator dan return nilainya endif info
28 Algoritma Evaluasi Pohon Ekspresi Dalam Bentuk Prosedur: Algoritma Evaluasi Pohon Ekspresi Dalam Bentuk Fungsi: Gambar 2.10 Pohon ekspresi dalam bentuk prosedur Gambar 2.11 Pohon ekspresi dalam bentuk fungsi
29 Tujuan Pembelajaran
30 Dynamic programming dapat didefinisikan sebagai suatu pendekatan matematik yang memiliki prosedure sistematis yang dirancang sedemikian rupa dengan tujuan untuk mengoptimalkan penyelesaian suatu masalah tertentu yang diuraikan menjadi sub-sub masalah yang lebih kecil yang terkait satu sama lain dengan tetap memperhatikan kondisi dan batasan permasalahan tersebut. Pemrograman Dinamis adalah teknik dalam pemrograman komputer yang membantu memecahkan masalah dalam sebuah class secara efisien yang memiliki sub-masalah tumpang tindih dan properti substruktur yang optimal. Jika ada masalah yang dapat dibagi menjadi submasalah, yang pada akhirnya dibagi lagi menjadi submasalah yang lebih kecil, dan jika ada tumpang tindih di antara sub-masalah tersebut, maka solusi untuk sub masalah dapat disimpan untuk referensi di masa mendatang. Dengan cara ini, efisiensi CPU dapat ditingkatkan. Metode pemecahan solusi ini disebut sebagai pemrograman dinamis. Masalah tersebut melibatkan penghitungan berulang kali nilai dari sub-masalah yang sama untuk menemukan solusi optimal. 1. Contoh Pemrograman Dinamis Mari kita cari urutkan fibonacci hingga suku ke5. Deret fibonacci adalah barisan bilangan yang setiap bilangannya merupakan jumlah dari dua
31 bilangan sebelumnya. Misalnya, 0,1,1, 2, 3. Di sini, setiap angka adalah jumlah dari dua angka sebelumnya. Algoritma Gambar 3. 1 Algoritma Pemrograman Dinamis a. Suku pertama adalah 0. b. Suku kedua adalah 1. c. Suku ketiga adalah jumlah dari 0 (dari langkah 1) dan 1 (dari langkah 2), yaitu 1. d. Suku keempat adalah jumlah dari suku ketiga (dari langkah 3 ) dan suku kedua (dari langkah 2) yaitu 1 + 1 = 2. e. Suku kelima adalah jumlah dari suku keempat (dari langkah 4) dan suku ketiga (dari langkah 3) yaitu 2 + 1 = 3. Jadi,urutan 0,1,1, 2, 3. Di sini, telah menggunakan hasil dari langkah-langkah sebelumnya seperti yang ditunjukkan di bawah ini. Ini disebut pendekatan pemrograman dinamis. Gambar 3. 2 Langkah-langkah pemrograman dinamis
32 2. Cara Kerja Pemrograman Dinamis Pemrograman Pemrograman ini bekerja dengan menyimpan hasil dari sub masalah sehingga ketika solusi mereka perlukan, mereka sudah tersedia dan kita tidak perlu menghitung ulang. Teknik menyimpan nilai sub-masalah ini disebut memoization. Dengan menyimpan nilai dalam array, kita menghemat waktu untuk perhitungan sub-masalah yang telah kita temui. Gambar 3. 3 Cara Kerja Pemrograman Dinamis Pemrograman Dinamis pemrograman dengan memoisasi adalah pendekatan top-down untuk pemrograman ini. Dengan membalikkan arah di mana algoritma bekerja yaitu dengan memulai dari kasus dasar dan bekerja menuju solusi, kita juga dapat mengimplementasikan secara bottom-up. Gambar 3. 4 Implementasi bottom-up
33 Algoritma greedy merupakan jenis algoritma yang menggunakan pendekatan penyelesaian masalah dengan mencari nilai maksimum sementara pada setiap langkahnya. Nilai maksimum sementara ini dikenal dengan istilah local maximum. Pada kebanyakan kasus, algoritma greedy tidak akan menghasilkan solusi paling optimal, begitupun algoritma greedy biasanya memberikan solusi yang mendekati nilai optimum dalam waktu yang cukup cepat. Algoritma Greedy adalah pendekatan dalam pemrograman yang memecahkan persoalan optimasi dengan cara yang tampaknya rakus. Pendekatan ini berfokus pada pengambilan keputusan sekarang dengan harapan bahwa setiap langkah akan membawa kita lebih dekat ke solusi akhir yang optimal. Dalam konteks greedy, kita selalu memilih opsi yang paling menguntungkan saat ini tanpa mempertimbangkan konsekuensi di masa depan. Ini mirip dengan mengambil sejumlah uang tunai yang tersedia dari mesin ATM tanpa memikirkan bagaimana pengeluaran itu akan memengaruhi saldo akhir. Kegunaan utama dari algoritma greedy adalah untuk menemukan solusi optimal dalam persoalan optimasi dengan cepat. Pendekatan ini sangat berguna dalam banyak kasus di mana kita perlu memaksimalkan atau meminimalkan sesuatu dengan cara yang efisien. Contoh penerapannya termasuk perencanaan jadwal,
34 pengkodean data, manajemen sumber daya, dan banyak lagi. Contoh Kasus A Algoritma Greedy Misalkan tersedia koin : 1, 3, 5. Uang senilai X=8 dapat di tukar dengan cara : Gambar 3. 5 Contoh kasus algoritma greedy Contoh Program Algoritma Greedy Berikut adalah contoh sederhana implementasi algoritma greedy dalam bahasa Python untuk menyelesaikan masalah Fractional Knapsack: Gambar 3. 6 Hasil penyelesaian algoritma greedy
35 Dynamic Programming (DP) dan Greedy Algorithm adalah dua teknik yang digunakan dalam pemecahan masalah komputasi dan optimasi. Meskipun keduanya adalah pendekatan yang berbeda, ada beberapa persamaan dan perbedaan penting antara keduanya: 1. Tujuan utama: a. Dynamic Programming: Tujuan utama DP adalah menemukan solusi optimal untuk masalah dengan memecahnya menjadi submasalah yang lebih kecil dan kemudian menyusun solusi dari solusi submasalah ini. DP cocok untuk masalah-masalah di mana solusi optimal global dapat ditemukan dengan menggabungkan solusi dari submasalah yang lebih kecil. b. Greedy Algorithm: Tujuan utama Greedy Algorithm adalah memilih langkah terbaik yang tersedia pada setiap langkah dalam upaya untuk mencapai solusi terbaik secara keseluruhan. Pendekatan ini lebih cocok untuk masalahmasalah di mana pengambilan keputusan sekuensial dapat dilakukan dengan cepat dan tanpa memperhatikan konsekuensi jangka panjang. 2. Submasalah: a. Dynamic Programming: DP memecah masalah menjadi submasalah yang lebih kecil dan menghitung solusi untuk masing-masing
36 submasalah. Hasil dari submasalah disimpan dalam tabel atau matriks sehingga tidak perlu dihitung ulang saat diperlukan. b. Greedy Algorithm: Greedy Algorithm tidak memecah masalah menjadi submasalah. Ini hanya fokus pada langkah terbaik berdasarkan aturan yang didefinisikan. 3. Keputusan: a. Dynamic Programming: DP membuat keputusan dengan mempertimbangkan solusi optimal dari submasalah yang lebih kecil. Solusi ditemukan dengan menggabungkan solusi dari submasalah ini. b. Greedy Algorithm: Greedy Algorithm membuat keputusan berdasarkan informasi yang tersedia pada titik tertentu dalam algoritma. Keputusan ini tidak selalu menghasilkan solusi global yang optimal. 4. Garansi Optimalitas: a. Dynamic Programming: DP memberikan jaminan untuk menemukan solusi optimal jika masalah dapat dipecah menjadi submasalah yang tumpang tindih atau saling bergantung. DP adalah pendekatan yang lebih umum untuk mencari solusi optimal. b. Greedy Algorithm: Greedy Algorithm tidak selalu memberikan solusi optimal global. Ini dapat memberikan solusi yang memadai untuk banyak masalah, tetapi tidak selalu optimal.
37 Dalam beberapa kasus, terdapat persamaan antara DP dan Greedy Algorithm, terutama jika Greedy Algorithm dapat menyelesaikan masalah dengan cepat dan menghasilkan solusi yang cukup mendekati optimal. Namun, dalam banyak masalah, DP adalah pendekatan yang lebih kuat dan dapat diandalkan untuk menemukan solusi optimal. Keputusan untuk menggunakan DP atau Greedy Algorithm akan tergantung pada karakteristik khusus masalah yang Anda hadapi. Ada beberapa perbedaan utama antara kedua pendekatan ini: 1. Feasibility: Dalam algoritma Greedy, kita membuat pilihan apa pun yang terbaik pada saat itu dengan harapan akan menghasilkan solusi optimal global. Di sisi lain, dalam Dynamic Programming, kita membuat keputusan pada setiap langkah dengan mempertimbangkan masalah saat ini dan solusi untuk submasalah yang telah diselesaikan sebelumnya untuk menghitung solusi optimal . 2. Optimality: Dalam Metode Greedy, kadang-kadang tidak ada jaminan untuk mendapatkan Solusi Optimal. Di sisi lain, Dynamic Programming dijamin akan menghasilkan solusi optimal karena umumnya mempertimbangkan semua kasus yang mungkin dan kemudian memilih yang terbaik.
38 3. Recursion: Metode Greedy mengikuti heuristik pemecahan masalah dengan membuat pilihan lokal yang optimal pada setiap tahap. Dynamic Programming adalah teknik algoritma yang biasanya didasarkan pada rumus berulang yang menggunakan beberapa keadaan yang telah dihitung sebelumnya. 4. Memoization: Algoritma Greedy lebih efisien dalam hal memori karena tidak pernah melihat atau merevisi pilihan sebelumnya. Dynamic Programming membutuhkan tabel Dynamic Programming untuk Memoization dan menghasilkan solusi yang lebih efisien dalam hal waktu. Dalam beberapa kasus, algoritma Greedy dapat digunakan sebagai pendekatan yang lebih sederhana dan cepat untuk memecahkan masalah optimasi tertentu. Namun, jika Anda membutuhkan solusi yang dijamin optimal, Dynamic Programming adalah pilihan yang lebih baik. Dynamic Programming (DP) dan Greedy Algorithm adalah dua teknik penting dalam ilmu komputer dan pemecahan masalah yang memiliki banyak aplikasi di kehidupan nyata. Berikut adalah beberapa contoh penggunaan keduanya:
39 1. Algoritma Huffman: Algoritma Greedy Huffman digunakan dalam kompresi data untuk menghasilkan kode biner yang optimal untuk karakter dalam teks atau data. 2. Algoritma Dijkstra: Algoritma Greedy Dijkstra digunakan dalam jaringan komunikasi dan transportasi untuk menemukan jalan terpendek antara dua titik dalam graf. 3. Algoritma Penjadwalan N-Job, M-Machine: Dalam pemecahan masalah penjadwalan, algoritma Greedy digunakan untuk menentukan urutan pelaksanaan pekerjaan pada sejumlah mesin untuk meminimalkan waktu penyelesaian. 4. Masalah Koin: Algoritma Greedy digunakan dalam masalah penyelesaian koin untuk memberikan kembalian dalam jumlah minimum dengan menggunakan koin dengan nilai yang berbeda. 5. Routing Protokol Jaringan: Beberapa protokol routing seperti RIP (Routing Information Protocol) menggunakan strategi Greedy untuk mengambil keputusan tentang rute terbaik dalam jaringan komputer. Greedy Algorithm sering digunakan ketika mencari solusi yang cukup mendekati optimal sudah cukup baik dan ketika keputusan dapat dibuat secara sederhana pada setiap langkah. Di sisi lain, Dynamic Programming digunakan ketika masalah memiliki sifat tumpang tindih atau submasalah yang dapat dipecahkan secara
40 independen, dan ketika diperlukan solusi yang benarbenar optimal. Kedua teknik ini memiliki aplikasi yang beragam di berbagai bidang, termasuk manufaktur, komputasi, jaringan, ilmu pengetahuan data, dan banyak lagi.
41 Tujuan Pembelajaran
42 Exhaustive search merupakan teknik pencarian solusi atas suatu permasalahan yang bersifat kombinatorik dengan menggunakan pendekatan brute force. Brute force adalah pendekatan yang straight forward dalam pemecahan suatu permasalahan dan didasarkan pada karakteristik persoalan yang dinyatakan. Secara teoritis, exhaustive search akan selalu menemukan solusi karena melakukan pencarian terhadap semua kemungkinan solusi, tetapi kelemahan dari exhaustive search ini adalah memerlukan waktu dan sumber daya yang sangat besar [1]. Berikut adalah langkah-langkah di dalam exhaustive search: 1. Enumerasi semua kemungkinan solusi 2. Evaluasi kemungkinan solusi yang ada satu per satu dan simpan solusi terbaik yang ditemukan sejauh ini 3. Umumkan solusi terbaik B. Traversal graf adalah teknik pencarian solusi dengan mengunjungi simpul secara sistematis. Teknik traversal graf dapat dibagi menjadi dua berdasarkan penentuan urutan simpul yang dikunjungi yaitu pencarian melebar (breadth first search / BFS) dan pencarian mendalam (depth first search / DFS). Selain itu, dalam proses pencarian, juga terdapat dua representasi graf yang mungkin yaitu graf statis dan graf