Design and Analysis of Algorithms CNH2G3- Week 6 Brute Force Algorithm Part 1: Design Strategy Dr. Putu Harry Gunawan (PHN) Daftar Isi 1 Introduction and Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Contoh-contoh algoritma brute force . . . . . . . . . . . . . . . . . . . . . . 3 3 Karakteristik algoritma brute force . . . . . . . . . . . . . . . . . . . . . . . 7 4 Advantages and Disadvantages of brute force Algorithm . . . . . . . . . 8 5 Homework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Review Tentukanlah kompleksitas waktu asimtotik untuk permasalahan di bawah ini 1. Exercise: diberikan relasi rekursi dari masalah Barisan Fibonacci berikut n=0 0, T (n) = 1, n=1 T (n − 1) + T (n − 2), n≥2 2. Exercise: diberikan relasi rekursi berikut 0, n=0 1, n=1 T (n) = 2, n=2 7T (n − 1) − 15T (n − 2) + 9T (n − 3), 3. Exercise: diberikan relasi rekursi berikut (QUIZ II semester lalu) n=0 0, 1 T (n) = n=1 10 , n 1 49T 7 − 100 n, n≥2 1 (0.1) (0.2) n≥3 (0.3) Theorem 0.1 (Master) Untuk suatu general Divide and Conquer recurrence: n T (n) = aT + f (n) (0.4) b Jika f (n) ∈ O(nd ) dengan d ≥ 0, dalam persamaan general Divide and Conquer recurrence di atas, maka d a < bd O(n ) T (n) ∈ (0.5) O(nd log n) a = bd b log a d ) a>b O(n Exercise Gunakan Teorema Master untuk mencari kompleksitas waktu asimtotik pada relasi rekursi untuk masalah Minimum dan Maksimum di bawah ini: n=1 0, T (n) = (0.6) 1, n=2 n 2T 2 + 2, n>2 1 Introduction and Definitions Setelah pemaparan analisi algoritma, maka akan dilanjutkan dengan strategi mendesain sutau algoritma. Bab ini ditujukan untuk berbagai macam strategi yang ada pada algoritma tipe Brute Force. Berikut adalah definisi dari Brute Force: Definition 1.1 (Levitin) Brute force is a straightforward approach to solving a problem, usually directly based on the problem statement and definitions of the concepts involved. Definition 1.2 (Levitin) Brute force adalah pendekatan yang langsung/lempeng untuk menyelesaikan suatu masalah, biasanya secara langusng sesuai dengan pernyataan masalah dan definisi dari konsep yang ada. Kata ”force” mempengaruhi definisi strategi yaitu suatu mesin/robot/komputer bukan sesutu yang berbau pintar( intelligent). ” Just do it! ” dapat merupakan cara lain untuk mendeskripsikan pengertian dari brute force. dan tentu saja strategi brute-force merupakan strategi yang paling mudah diaplikasikan. Sebagai contoh, misalkan masalah eksponensial: Hitung an untuk a ∈ R − {0} dan n ∈ Z + . Meskipun masalah ini terlihat trivial, akana tetapi masalah ini dapat digunakan sebagai ilustrasi dari mendesain strategi suatu algoritma, dalam hal ini bisa dalam brute force. Secara definisi (1.1) an = |a × a × {z· · · × a} n kali 2 Dari definisi diatas, maka agoritma brute force akan mengalikan a sebanyak n kali. Dan, tentu saja dengan cara ini akan mendapatkan O(n). Jika tidak menggunakan brute force, maka waktu asimtotiknya dapat diperkecil seperti pada contoh -contoh berikut berikut: Example 1.3 Bilangan n dapat direpresentasikan menjadi bilangan 2 pangkat n = 2k1 + 2k2 + · · · + 2km sehingga k1 an = a2 + a2 k2 + · · · + a2 km dengan kompleksitas waktu yang digunakan adalah O(log n). Sebagai contoh hitung a25 , maka (25)10 = (11001)2 yang dapat direpresentasikan menjadi bilangan biner sehingga: a25 = a4 + a3 + 0 + 0 + a0 . Example 1.4 Contoh lain dengan kompleksitas waktu O(log n) adalah ( (an/2 )(an/2 ) (n mod 2 = 0), f (x) = an = n−1 n−1 otherwise, a(a 2 )(a 2 ) Example 1.5 Contoh lain bentuk rekursif dengan kompleksitas waktu O(log n) adalah ( n−1 if n ganjil, a(a2 ) 2 n f (x) = a = n 2 (a ) 2 if n genap, Dari contoh di atas dapat kita simpulkan bahwa, brute force, memecahkan masalah dengan sangat sederhana, langsung, dan dengan cara yang jelas (obvious way). 2 Contoh-contoh algoritma brute force Selain contoh menghitung pangkat eksponensial pada subbab sebelumnya, maka pada bab ini kana diberikan beberapa contoh lain dari pengguanaan brute force: 1. Menghitung n! untuk n ∈ Z + + {0}. Algoritma untuk menghitung faktorial adalah ( 1, n=0 n! = n × (n − 1) × · · · × 2 × 1, n ≥ 1 3 2. Menghitung perkalian dua buah matrix yang berukuran n × n. • Misalkan C = AB dan elemen-elemen matrik dinyatakan sebagai cij , aij , dan bij cij = ai1 b1j + ai2 b2j + · · · + ain bnj = n X aik bkj k=1 • Algoritma: hitung setiap elemen hasil perkalian satu persatu, dengan cara mengalikan dua vektor yang panjangnya n. 3. Menemukan semua faktor dari bilangan bulat n selain 1 dan n itu sendiri. int t a g ; int ∗ f a c t o r s ( int n ) { int a [ 1 0 0 0 0 0 0 ] ; for ( int i =1; i<=n / 2 ; i ++) if ( n%i ==0) a[++t a g ]= i ; a[++t a g ]=n ; return ( a ) ; } 4. Mencari elemen terbesar atau terkecil. struct p a i r getMinMax ( int a r r [ ] , int n ) { struct p a i r minmax ; int i ; /* If there is only one element then return it as min and max both */ if ( n == 1 ) { minmax . max = a r r [ 0 ] ; minmax . min = a r r [ 0 ] ; return minmax ; } /* If there are more than one elements , then initialize min and max */ if ( a r r [ 0 ] > a r r [ 1 ] ) { minmax . max = a r r [ 0 ] ; minmax . min = a r r [ 1 ] ; } else { minmax . max = a r r [ 1 ] ; minmax . min = a r r [ 0 ] ; } for ( i = 2 ; i <n ; i ++) { if ( a r r [ i ] > minmax . max) minmax . max = a r r [ i ] ; else if ( a r r [ i ] < minmax . min ) minmax . min = a r r [ i ] ; 4 } return minmax ; } 5. Sequential Search: Diberikan n buah bilangan bulat yang dinyatakan sebagai {a1 , a2 , · · · , an }. Carilah apakah x terdapat di dalam himpunan bilangan bulat tersebut. Jika x ditemukan, maka lokasi index elemen yang bernilai x disimpan di dalam peubah idx. Jika x tidak terdapat di dalam himpunan tersebut, maka idx diisi dengan nilai 0. Sequential/Linear Search ( Array A, Value x) Step Step Step Step Step Step Step Step 1: 2: 3: 4: 5: 6: 7: 8: Set i to 1 if i > n then go to step 7 if A[i] = x then go to step 6 Set i to i + 1 Go to Step 2 Print Element x Found at index i and go to step 8 Print element not found Exit 6. Bubble Sort: • Apa metode yang paling lempeng dalam memecahkan masalah pengurutan? Jawabannya adalah algoritma bubble sort. • Algoritma bubble sort mengimplementasikan teknik brute force dengan jelas sekali b e g i n BubbleSort ( l i s t ) for a l l e l e m e n t s o f l i s t if l i s t [ i ] > l i s t [ i +1] swap ( l i s t [ i ] , l i s t [ i +1]) end if end for return l i s t end BubbleSort Bubble sort sendiri merupakan algoritma pengurutan data yang paling sederhana. Algoritma ini membandingkan elemen bertetanggan dan menukarkannya jika tidak dalam urutan yang benar. Algoritma ini tidak cocok digunakan untuk data set yang besar karena memiliki waktu terburuk (worst case complexity) O(n2 ). 7. Uji keprimaan: Persoalan: Diberikan sebuah bilangan bulat positif. Ujilah apakah bilangan tersebut merupakan bilangan prima atau bukan. 5 function is_prime(n) if n 1 return false else if n 3 return true else if n mod 2 = 0 or n mod 3 = 0 return false let i 5 while i * i n if n mod i = 0 or n mod (i + 2) = 0 return false i i + 6 return true 8. Menghitung nilai polinom secara brute force Persolana: Hitung nilai polinom: p(x) = an xn + an−1 xn−1 + · · · + a1 x + a0 pada titik x = x0 . 9. Pencocokan string: Persoalan : Diberikan teks ( text ), yaitu ( long ) string yang panjangnya n karakter. (a) pattern, yaitu string dengan panjang m karakter ( m < n ) yang akan dicari di dalam teks. (b) Kemudian, carilah lokasi pertama di dalam teks yang bersesuaian dengan pattern. Example 2.1 (String) Example Pattern : NOT Teks : NOBODY NOTICED HIM (a) NOBODY NOTICED HIM (b) NOT (c) NOT (d) (e) (f ) (g) (h) (i) NOT NOT NOT NOT NOT NOT 6 10. Mencari pasangan titik terdekat: Diberikan sembarang titik dalam 2D atau 3D, lalu carilah dua pasang titik yang memiliki jarak terkecil. Contoh dalam 2D lihat pada gambar berikut: Gambar 1: Contoh sebaran 6 titik pada domain kartesian. • Jarak dua buah titik di bidang 2-D dengan P1 = (x1 , y1 ) dan P2 = (x2 , y2 ) dapat dicari menggunakan rumus Euclidian: p d(P1 , P2 ) = ||P1 − P2 || = (x1 − x2 )2 + (y1 − y 2 )2 • Algoritma brute force: 1. Hitung jarak setiap pasang titik. 2. Pasangan titik yang memepunyai jarak terpendek itulah jawabnnya. • Algortma brute force akan menghitung sebanyak C(n, 2) = n (n−1) pasangan 2 titik dan memeilih pasangan titik yang mempunyai jarak terkecil. Kompleksitas waktu algoritma ini adalah O(n2 ). 3 Karakteristik algoritma brute force Berikut adalah karakteristik algoritma brute force: 1. Algoritma brute force umumnya tidak ”cerdas” dan tidak mangkus, karena membutuhkan jumlah langkah yang besar dalam penyelesaiannya. Kadang - kadang algoritma brute force disebut juga algoritma naif ( naive algorithm ). 2. Algoritma brute force seringkali merupakan pilihan yang kurang disukai karena ketidakmangkusannya itu, tetapi dengan mencari pola -pola yang mendasar, keteraturan, atau trik - trik khusus, biasanya akan membantu kita menemukan algoritma yang lebih cerdas dan lebih mangkus. 3. Untuk masalah yang ukurannya kecil, kesederhanaan brute force biasanya lebih diperhitungkan dari pada ketidakmangkusannya. Algoritma brute force sering digunakan sebagai basis bila membandingkan dengan beberapa alternatif algoritma yang mangkus. 7 4. Algoritma brute force seringkali lebih mudah diimplementasikan dari pada algoritma yang lebih canggih, dan karena kesederhanaannya, kadang-kadang algoritma brute force dapat lebih mangkus (ditinjau dari segi implementasi). 4 Advantages and Disadvantages of brute force Algorithm Berikut akan diberikan beberapa kekuatan dan kelemahan dari menggunakan algoritma brute force. Kekuatan: 1. Metode brute force dapat digunakan untuk memecahkan hampir sebagian besar masalah ( wide applicability ). 2. Metode brute force sederhana dan mudah dimengerti. 3. Metode brute force menghasilkan algoritma yang layak untuk beberapa masalah penting seperti pencarian, pengurutan, pencocokan string, perkalian matriks. 4. Metode brute force menghasilkan algoritma baku (standard) untuk tugas - tugas komputasi seperti penjumlahan/perkalian n buah bilangan, menentukan elemen minimum atau maksimum di dalam tabel ( list ). Sedangkan Kelemhan: 1. Metode brute force jarang menghasilkan algoritma yang mangkus. 2. Beberapa algoritma brute force lambat sehingga tidak dapat diterima. 3. Tidak sekontruktif/sekreatif teknik pemecahan masalah lainnya. 4. Ken Thompson ( salah seorang penemu Unix) mengatakan : ” When in doubt, use brute force ”, faktanya kernel Unix yang asli lebih menyukai algoritma yang sederhana dan kuat ( robust ) daripada algoritma yang cerdas tapi rapuh. References 1. Anany, L. (2003). Introduction to the design and analysis of algorithms. Villanova University. 2. https://www.quora.com/What-are-some-fast-algorithms-for-computing-the-nth-powerof-a-number 3. http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/ 4. https://www.tutorialspoint.com/data structures algorithms/bubble sort algorithm.htm 8 5 Homework 1. Diberikan n titik pada daerah 2-D Euclidean, yaitu {p1 , p2 , · · · pn }. Buatlah algoritma brute force untuk menentukan titik paling bawah dalam daerah 2-D Euclidean. 2. Consider the problem of counting, in a given text, the number of substrings that start with an A and end with a B. For example, there are four such substrings in CABAAXBYA. (a) Design a brute-force algorithm for this problem and determine its effi- ciency class. (b) Design a more efficient algorithm for this problem. 3. Word Find A popular diversion in the United States, word find (or word search) puzzles ask the player to find each of a given set of words in a square table filled with single letters. A word can read horizontally (left or right), vertically (up or down), or along a 45 degree diagonal (in any of the four directions) formed by consecutively adjacent cells of the table; it may wrap around the tables boundaries, but it must read in the same direction with no zigzagging. The same cell of the table may be used in different words, but, in a given word, the same cell may be used no more than once. Write a computer program for solving this puzzle. (See http://thewordsearch.com/ for more detail). 4. (a) Design a brute-force algorithm for computing the value of a polynomial p(x) = an xn + an−1 xn−1 + · · · + a1 x + a0 at a given point x0 and determine its worst-case efficiency class. (b) If the algorithm you designed is in Θ(n2 ), design a linear algorithm for this problem. (c) Is it possible to design an algorithm with a better-than-linear efficiency for this problem? 5. Alternating disks You have a row of 2n disks of two colors, n dark and n light. They alternate: dark, light, dark, light, and so on. You want to get all the dark disks to the right-hand end, and all the light disks to the left-hand end. The only moves you are allowed to make are those that interchange the positions of two neighboring disks. Design an algorithm for solving this puzzle and determine the number of moves it takes. 9