Tim Matematika Diskrit ANALISA ALGORITMA Tim Matematika Diskrit
Pendahuluan Algoritma adalah spesifikasi urut-urutan langkah untuk melakukan pekerjaan tertentu. Dalam program komputer, algoritma berarti urutan-urutan langkah kasar yang harus dilakukan untuk menyelesaikan masalah. Algoritma harus dibuat sebelum pembuatan program. Algoritma haruslah benar. Algoritma yang baik harus mampu memberikan hasil yang sedekat mungkin dengan nilai yang sebenarnya. Efisiensi algoritma (efisiensi waktu dan memori)
Notasi “O” Perbedaan waktu proses sebagai fungsi jumlah data yang diproses sangat erat hubungannya dengan laju pertumbuhan (rate of growth) algoritma yang bersangkutan. Laju pertumbuhan menunjukkan faktor kelipatan waktu proses seiring dengan kenaikan jumlah data. Dalam komputer, laju pertumbuhan dinyatakan dalam notasi-O. (dibaca notasi big-oh) Notasi-O memberikan cara untuk menyatakan laju pertumbuhan algoritma secara global/aproksimasi dan tidak memperhatikan perbedaan faktor konstanta serta perbedaan- perbedaan lain yang tidak begitu berpengaruh.
Misalkan f dan g adalah fungsi berharga riil yang didefinisikan pada himpunan bilangan-bilangan riil. Fungsi f berorder g (ditulis f(x) = O(g(x)) bila dan hanya bila terdapat suatu bilangan positif M dan bilangan riil x0 sedemikian hingga |f(x)| ≤ M |g(x)| untuk x > x0 f(x) = O(g(x)) dibaca “g adalah aproksimasi big-oh untuk f”. Definisi di atas dapat digambarkan sbb. Perhatikan bahwa grafik M |g(x)| berada di atas grafik |f(x)| untuk x > x0. Y grafik M.g(x) grafik f(x) x0 X
Contoh 1 Nyatakan pertidaksamaan-pertidaksamaan sbb dalam notasi-O a. |17x6 – 3x3 + 2x + 8 | ≤ 30 |x6| untuk semua bilangan riil x > 1 b. | x + 3x(2log x) | ≤ 4 | x(2log x) | untuk semua bilangan riil x > 2 Penyelesaian: a. f(x) = 17x6 – 3x3 + 2x + 8; g(x) = x6 Ambil M = 30 dan x0 = 1, maka pertidaksamaan dapat dituliskan sebagai | f(x) | ≤ M g(x) x > x0 sehingga f(x) = 17x6 – 3x3 + 2x + 8 adalah O (x6) b. f(x) = x + 3x(2log x); g(x) = x (2log x) Ambil M = 4 dan x0 = 2. Maka pertidaksamaan dapat dituliskan f(x) = x + 3x (2log x) adalah O (x (2log x))
Contoh 2 Buktikan bahwa: a. 3x3 + 2x + 7 adalah O(x3) untuk x > 1 b. 7x3 – 2x + 3 adalah O(x3) untuk x > 1 Penyelesaian: a. x > 1, | 3x3 + 2x + 7 | = 3x3 + 2x + 7 ≤ 3x3 + 2x3 + 7x3 karena 2x < 2x3 dan 7 < 7x3 untuk x > 1 | 3x3 + 2x + 7 | ≤ 12x3 = 12 | x3 | untuk setiap x > 1 karena x3 tidak negatif. Ambil M = 12 dan x0 = 1. maka pertidaksamaan di atas berarti | 3x3 + 2x + 7 | ≤ M | x3 | x > x0. Atau berarti bahwa 3x3 + 2x + 7 adalah O (x3)
b. | 7x3 – 2x + 3 | ≤ | 7x3 + 2x + 3 | ≤ | 7x3| + |2x| + |3| karena x > 1 | 7x3 – 2x + 3 | ≤ 7x3 + 2x + 3 karena x > 1 sehingga | x | = x | 7x3 – 2x + 3 | ≤ 7x3 + 2x3 + 3x3 karena 2x < 2x3 dan 3 < 3x3 | 7x3 – 2x + 3 | ≤ 12x3 | 7x3 – 2x + 3 | ≤ 12 | x3 | karena x > 1 sehingga | x | = x Ambil M = 12 dan x0 = 1 maka | 7x3 – 2x + 3| ≤ M | x3| x > x0 yang berarti 7x3 – 2x + 3 adalah O (x3) Teorema 1. Jika a0, a1, …, an adalah bilangan riil dengan an ≠ 0 maka f(x) = anxn + … + a1x + a0 adalah O (xn)
Contoh 3 Carilah order deret 1 + 2 + 3 + … + n Penyelesaian: 1 + 2 + 3 + … + n = ½ n (n+1) = ½ n2 + ½ n Menurut teorema 1, ½ n2 + ½ n adalah O (n2) sehingga 1 + 2 + 3 + … + n adalah O (n2)
Teorema 2. Jika b adalah bilangan riil > 1 maka: blogx adalah O(xn) untuk semua bilangan bulat n 1 xn adalah O(bx) untuk semua bilangan bulat n 0 x blogx adalah O(x2) x b. y = 2x y = x2 y = x 2log x y = x y = 2 log x
Notasi-O yang menyatakan bahwa f(x) = O(g(x)) hanyalah mensyaratkan bahwa |f(x)| M g(x) x > x0. Tidak ada syarat bahwa batas g(x) tersebut harus dibuat sedekat mungkin dengan f(x). Secara praktis memang sulit untuk mencari fungsi g(x) yang grafiknya tepat terletak di atas f(x) untuk x > x0. Biasanya digunakan fungsi g(x) yang lazim dipakai dan cukup dekat dengan f(x). Oleh karena itu, order suatu fungsi tidaklah tunggal. Sebagai contoh, polinomial f(x) = anxn + … + a1x + a0 mempunyai order O(xn), tetapi polinomial itu juga O(bx). Karena kedua order tersebut sering dipakai, sedangkan grafik fungsi f(x) = bx lebih atas dibanding xn, maka dikatakan bahwa polinomial anxn + … + a1x + a0 adalah O(xn) dan bukan O(bx).
Teorema 3. Hirarki fungsi yang sering dipakai untuk menyatakan order adalah sebagai berikut: (setiap fungsi merupakan big-oh dari fungsi di kanannya) 1, 2log(n), … , 4√n, 3√n, √n, n, n(2log(n)), n√n, n2, n3, …, 2n, n!, nn
Teorema 4. a. Jika f(n) = O(g(n)) dan c adalah konstanta, maka c f(n) = O(g(n)) b. Jika f(n) = O(g(n)) dan h(n) = O(g(n)), maka f(n) + h(n) = O(g(n)) c. Jika f(n) = O(a(n)) dan g(n) = O(b(n)), maka f(n) g(n) = O(a(n) b(n)) d. Jika a(n) = O(b(n)) dan b(n) = O(c(n)), maka a(n) = O(c(n)) e. Jika f(n) = O(a(n)) dan g(n) = O(b(n)), maka f(n) + g(n) = O(max {|a(n)|, |b(n)|}
Jika kedua ruas dikalikan dengan |c| maka Bukti: f(n) = O(g(n)) berarti terdapat M > 0 dan n0 sedemikian hingga |f(n)| M |g(n)| n > n0 Jika kedua ruas dikalikan dengan |c| maka |c| |f(n)| |c| M |g(n)| atau |c f(n)| |c| M |g(n)| Sebut |c| M = M1. Karena M dan c adalah konstanta, maka M1 = |c| M juga konstanta sehingga |c f(n)| M1 |g(n)|. Ini berarti bahwa c f(n) = O(g(n))
b. f(n) = O(g(n)) berarti terdapat M1 > 0 dan n1 sedemikian hingga |f(n)| M1 |g(n)| n > n1 h(n) = O(g(n)) berarti terdapat M2 > 0 dan n2 sedemikian hingga |h(n) M2 |g(n)| n > n2 |f(n) + h(n)| |f(n)| + |h(n)| Ambil n0 = max (n1, n2). Karena |f(n)| M1 |g(n)| dan |h(n)| M2 |g(n)|, maka |f(n) + h(n)| M1 |g(n)| + M2 |g(n)| n > n0 |f(n) + h(n)| (M1 + M2) |g(n)| n > n0 |f(n) + h(n)| M |g(n)| dengan M = M1 + M2 Pertidaksamaan terakhir ini berarti bahwa f(n) + h(n) = O(g(n))
Contoh 4. Nyatakan fungsi di bawah ini sebagai notasi-O fungsi-fungsi yang ada dalam teorema 3. a. n + n (2log n) b. √n3 sin n (2log n) c. ½ n (2log n) + 3n + 15
Penyelesaian: a. n = O(n), n (2log n) = O(n(2log n)) Menurut teorema 4(e), maka n + n(2log n) = O (max {n, n(2log n)}) Dalam teorema 3, O(n) terletak lebih kiri dibandingkan dengan n (2log n) maka max { n, n (2log n)} = n (2log n), sehingga n + n (2log n) adalah O(n (2 log n)) b. √n3 sin n n3 karena sin n 1, sehingga √n3 sin n adalah O(√n3). Di samping itu, 2log n adalah O(√n) Menurut teorema 4 (c) maka √n3 sin n (2log n) adalah O(√n3 √n) = O(n2)
c. ½ n (2 log n) adalah O(n (2 log n) 3n adalah O(n), 15 adalah O(1) menurut teorema 4(e) maka ½ n (2 log n) + 3n + 15 adalah O(max { n (2 log n), n, 1}). karena n (2 log n) terletak paling kanan, maka max { n ( 2 log n), n, 1} = n (2 log n), sehingga ½ n ( 2 log n) + 3n + 15 adalah O(n (2 log n))
Contoh 5. Buktikan bahwa 2n bukan O(na) untuk semua bilangan bulat a > 1. Penyelesaian: Akan dibuktikan metode kontradiksi. Misalkan 2n = O(na). Maka terdapatlah bilangan bulat M > 0 dan bilangan riil n0 sehingga |2n| M |na| untuk n > n0. Karena n dan a positif maka harga mutlak bisa dihilangkan. Jadi 2n M na. Jika kedua ruas dilogaritmakan, akan menghasilkan pertidaksamaan: 2 log (2n) 2 log (M na) n 2log M + a (2log n) n / (2log n) (2 log M)/(2 log n) + a Untuk n > 2 maka 2 log n > 1 sehingga (2 log M)/(2 log n) < 2 log M
Didapat pertidaksamaan n/(2 log n) 2 log M + a Terjadilah kontradiksi karena M dan a adalah suatu konstanta sehingga 2 log M + a adalah suatu besaran yang harganya tetap. Sebaliknya ruas kiri dapat menjadi semakin besar untuk n yang semakin besar, sehingga dapat melebihi besarnya konstanta ruas kanan. Jadi pengandaian 2n = O(na) salah. Yang benar 2n bukan O(na)
Efisiensi Algoritma Analisa yang paling sering dilakukan pada suatu algoritma adalah waktu proses. Menentukan waktu proses secara tepat merupakan pekerjaan yang sngat sulit, karena waktu proses secara eksak sangat tergantung pada implementasi algoritma dan perangkat keras yang dipakai. Analisa yang diinginkan untuk menyatakan efisiensi algoritma haruslah dibuat seumum mungkin sehingga bisa dipakai pada semua algoritma, terlepas dari implementasi maupun perangkat keras yang digunakan. Kompleksitas algoritma cukup dinyatakan dalam order waktu proses (Big-Oh) sebagai fungsi jumlah data masukan yang diberikan.
Contoh 6. Perhatikan potongan program untuk menghitung jumlahan n buah bilangan riil yang disimpan dalam suatu vektor V Sum = 0 bagian (a) For i = 1 to n Sum = sum + V[i] bagian (b) End For I Write (sum) bagian (c) Carilah operasi aktif program tersebut dan nyatakan order waktu proses sebagai fungsi jumlah masukan (n).
Penyelesaian: Untuk mencari operasi aktif, haruslah ditentukan berapa kali program dieksekusi pada tiap-tiap bagiannya. Bagian (a) dieksekusi 1 kali Bagian (b) merupakan suatu kalang (loop). Kalang ini akan diproses berdasarkan kenaikan harga i, dari i = 1 hingga i = n. Jadi statemen Sum = sum + V[i] akan diproses sebanyak n kali sesuai dengan kenaikan harga i. Bagian (c) akan diproses 1 kali. Karena bagian (b) merupakan bagian yang paling sering diproses, maka bagian (b) merupakan operasi aktifnya. Bagian (a) dan (c) dapat diabaikan karena bagian-bagian tsb tidak diproses sesering bagian (b). Bagian (b) diproses sebanyak data yang dimasukkan (n). Maka program penjumlahan bilangan riil mempunyai order sebanding dengan n. Jadi, program mempunyai order O(n).
Contoh 7. Carilah order waktu proses bagian-bagian program di bawah ini (n adalah bilangan bulat positif yang menyatakan jumlah data). a. For i = 2 to n A = 2*n + i*n End For i b. For i = 1 to n For j = 1 to i A = n + i*j End For j
Penyelesaian: a. Jumlah pemrosesan statemen A = 2. n + i Penyelesaian: a. Jumlah pemrosesan statemen A = 2*n + i*n mengikuti iterasi dalam i, yaitu dari i = 2 hinggan i = n. Jadi sebanyak (n-2) + 1 = (n-1) kali. Perhatikan bahwa yang dipentingkan di sini bukanlah berapa nilai variabel A (yang merupakan fungsi dari i dan n), tetapi frekuensi pemrosesan A. Jadi algoritma mempunyai order O(n). b. Pada i=1, j berjalan dari 1 hingga 1 sehingga A diproses 1 kali Pada i=2, j berjalan dari 1 hingga 2 sehingga A diproses 2 kali dst Pada i=n, j berjalan dari 1 hingga n sehingga A diproses n kali. Secara keseluruhan A akan diproses sebanyak (1+2+…+n) = n(n+1)/2 kali. Maka algoritma mempunyai order O(n2).
Latihan 1. Carilah bilangan bulat N sedemikian hingga jika n > N, maka n/log n > 100. 2. Mana fungsi yang lebih besar (grafiknya lebih atas): log(n) ataukah log (log(n))? Jelaskan alasan saudara. Carilah Big-Oh fungsi soal nomor 3-8 berikut ini: 3. f(n) = n2 + 3n – 1 4. f(n) = (3n2 + 5n – 13)2 5. f(n) = (3 log n + n)2 6. f(n) = (n (2log n) + 1)2 7. f(n) = 1 + 2 + 22 + 23 + … + 2n 8. f(n) = n + n/2 + n/4 + … + n/2n
Carilah konstanta M sehingga f(n) = O(g(n)) untuk tiap-tiap soal nomor 9 – 12 berikut ini: 9. f(n) = 17n + 31; g(n) = n 10. f(n) = 3n2 – 4n + 5: g(n) = n2 11. f(n) = 0,2n + 100.000; g(n) = n 12. f(n) = n3 + 3n2 + 5n + 11; g(n) = n4 13. Buktikan bahwa f(n) = n2 bukanlah O(n) 14. Ada 2 buah program (misal L dan Q) yang masing-masing dapat menyelesaikan suatu masalah yang sama dengan benar. Program L bersifat linier dan membutuhkan waktu 20 menit untuk menyelesaikan masalah dengan 10 data. Program Q adalah kuadratis yang membutuhkan waktu 5 menit untuk menyelesaikan masalah yang sama dengan 10 data. Andaikan kita mempunyai masalah dengan 10 data, program mana yang lebih cepat untuk menyelesaikan?
Dalam potongan program soal nomr 15 – 16 di bawah ini: a Dalam potongan program soal nomr 15 – 16 di bawah ini: a. Hitunglah jumlah operasi (seperti penjumlahan, perkalian dan lain-lain) yang harus dilakukan oleh program tersebut. b. Hitunglah order/kompleksitas algoritma tersebut yang dinyatakan sebagai fungsi jumlah data (= n) 15. For i=3 to (n-1) a = 3*n + 2*i- 1 End For i 16. Max = A[1] For i=2 to n If max < a[i] then max = a[i]