My first Magazine pemrograman-kompetitif-dasar | Page 51

4.3 Optimisasi Teknik Brute Force Algoritma 19 Solusi permasalahan Mengatur Persamaan. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: function COUNT T RIPLETS () count ← 0 for i ← 1, N do for j ← 1, N do for k ← 1, N do p ← a[i] q ← a[ j] r ← a[k] if (p + q + r) = 0 then count ← count + 1 end if end for end for end for return count end function Apakah ada solusi yang lebih baik? Sebenarnya, kita bisa mengambil suatu observasi sederhana yang cukup berguna untuk mempercepat solusi kita. Observasi: Jika kita sudah menentukan nilai p dan q, maka nilai r haruslah −(p + q). Berdasarkan observasi tersebut, kita dapat mencoba semua kemungkinan p dan q, lalu memeriksa apakah −(p + q) terdapat di dalam array. Untuk mempercepat, pencarian −(p + q) bisa menggunakan binary search . Implementasi solusi tersebut terdapat pada Algoritma 20. Algoritma 20 Solusi permasalahan Mengatur Persamaan yang dioptimasi. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: function COUNT T RIPLETS F AST () count ← 0 for i ← 1, N do for j ← 1, N do p ← a[i] q ← a[ j] r ← −(p + q) if EXIST (r) then count ← count + 1 end if end for end for return count end function Pada Algoritma 20, fungsi EXIST (r) adalah fungsi untuk memeriksa keberadaan r di himpunan {a 1 , a 2 , ..., a N } dengan menggunakan binary search (tentunya setelah diurutkan). Kompleksitas dari COUNT T RIPLETS F AST sendiri adalah O(N 2 log N). Kompleksitas O(N 2 log N) sudah cukup untuk N yang mencapai 2.000. Dari sini kita belajar bahwa optimisasi pada pencarian kadang diperlukan, meskipun ide dasarnya adalah brute force . 41