waktu komputasi yang diperlukan oleh suatu algoritma Waktu komputasi suatu algoritma bergantung pada: ◦ Input ◦ Komputer yang dipilih ◦ Bahasa pemrograman yang digunakan ◦ Implementasi algoritma tersebut Parameter input sangat esensial dan tidak dapat diabaikan Komputer cepat berubah, sehingga tidak tepat digunakan untuk membandingkan algoritma Demikian juga bahasa pemrograman tidak tepat untuk membandingkan algoritma karena juga perkembangan bahasa pemrograman dengan berbagai variasi dan tatabahasa Implementasi algoritma juga bergantung bahasa pemrograman dan komputer yang dipilih, sehingga juga tidak tepat digunakan membandingkan algoritma Dengan demikian: Pengertian waktu komputasi disederhanakan menjadi bergantung pada algoritma itu sendiri dan inputnya Ini berarti bahwa waktu komputasi tidak menggunakan satuan waktu, tetapi dengan satuan langkah Waktu komputasi yang paling banyak digunakan adalah waktu komputasi terjelek (the worst case comp time) Waktu komputasi merupakan fungsi 𝑓: ℕ ⟶ ℕ yang monoton naik Fungsi ini seringkali tidak bisa secara eksak ditentukan, sehingga seringkali yang digunakan adalah batas atas maupun batas bawah Waktu komputasi tergantung pada: ◦ Variabel ◦ Banyak operasi ◦ Struktur algoritma ◦ Procedure/function call Beberapa asumsi: ◦ Tidak ada perbedaan jenis operasi atau tipe variabel ◦ Assigment dengan konstanta dianggap 1 langkah ◦ Procedure/function yang reserved dianggap mempunyai suatu konstante langkah, atau bahkan 1 langkah ◦ Struktur algoritma tidak menggunakan goto ◦ Tidak memperhitungkan stack Struktur Algoritma ◦ Sekuensial: S1, S2, S3, ….. Masing2 mempunyai waktu komputasi t1, t2, t3, …., maka waktu komputasi total adalah t1+t2+t3+…….. ◦ Pencabangan: IF K THEN S1 ELSE S2, dengan wk K adalah tk, S1 adalah t1 dan S2 adalah t2, maka waktu komputasinya tk+max{t1, t2} ◦ Loop: Mempunyai kontrol yang pasti For var = bawah to atas S(var) Jika tk adalah waktu untuk kontrol loop, dan t(var) adalah waktu komputasi S(var), maka waktu komputasi untuk loop tersebut adalah tk + 𝑎𝑡𝑎𝑠 𝑣𝑎𝑟=𝑏𝑎𝑤𝑎 𝑡(𝑣𝑎𝑟) Subroutine (procedure/function) Misalkan T(n) waktu komputasi untuk memanggil subroutine dengan parameter n, maka T(n) memuat stack, parameter, dan body subroutine tersebut. Parameter bisa diabaikan karena konstante, sedangkan stack tidak mudah ditentukan, oleh karena itu bisa dianggap konstante. Dengan demikian T(n) bergantung pada waktu komputasi body subroutinenya. Untuk bentuk yang rekursif juga sama, hanya saja waktu komputasinya memuat waktu untuk memanggil subroutine secara rekursif. Ini berarti bahwa waktu komputasinya juga merupakan bentuk rekursif Oleh karena itu, waktu komputasi bisa dinyatakan sebagai fungsi 𝑓: ℕ ⟶ ℝ+ Waktu komputasi akan dinyatakan sehingga faktor konstan tidak berpengaruh Notasi O (big-Oh) digunakan sebagai cara untuk mengukur kecepatan pertumbuhan, atau order magnitute fungsi 𝑓: ℕ ⟶ ℝ+ yang merupakan waktu komputasi Definisi: 𝑓 = 𝑂 𝑔 , 𝑎𝑡𝑎𝑢 𝑓 ∈ 𝑂(𝑔) dapat diartikan bahwa f secara asimtotik naik tidak lebih cepat daripada g, dan didefinisikan dengan syarat bahwa 𝑓(𝑛) terbatas ke atas oleh konstante c>0 𝑔(𝑛) O(g) dapat dinyatakan sebagai himpunan fungsi dengan sifat keanggotaan sebagai berikut: ◦ 𝑂 𝑔 = 𝑓|∃𝑐 > 0, ∃𝑛𝑜 ∈ ℕ, ∀𝑛 ≥ 𝑛𝑜 𝑏𝑒𝑟𝑙𝑎𝑘𝑢 𝑓 𝑛 ≤ 𝑐𝑔 𝑛 𝑓(𝑛) Dengan demikian, 𝑓 ∈ 𝑂(𝑔) apabila lim <∞ 𝑛→∞ 𝑔(𝑛) (berhingga) Beberapa sifat O ◦ 𝑐. 𝑓 + 𝑑 ∈ 𝑂 𝑓 𝑢𝑛𝑡𝑢𝑘 𝑐, 𝑑 ≥ 0 ◦ 𝑐. 𝑂 𝑓 = 𝑂 𝑓 𝑢𝑛𝑡𝑢𝑘 𝑐 ≥ 0 ◦ 𝑂 𝑓 ∪ 𝑂 𝑔 = 𝑂 𝑓 + 𝑔 = 𝑂(max 𝑓, 𝑔 ) ◦ 𝑂 𝑓 . 𝑂 𝑔 = 𝑂 𝑓. 𝑔 Big-Oh dianggap sebagai batas atas Berdasarkan notasi big-Oh tersebut, kemudian didefinisikan notasi big-Omega (batas bawah) dan big- Theta (batas atas dan bawah) sebagai berikut: Definisi: 𝑓 = Ω 𝑔 , 𝑎𝑡𝑎𝑢 𝑓 ∈ Ω(𝑔) dapat diartikan bahwa f secara asimtotik naik, paling tidak secepat 𝑓(𝑛) g, dan didefinisikan dengan syarat bahwa 𝑔(𝑛) terbatas ke bawah oleh konstante c>0 (g) dapat dinyatakan sebagai himpunan fungsi dengan sifat keanggotaan sebagai berikut: ◦ Ω 𝑔 = 𝑓|∃𝑐 > 0, 𝑛𝑜 ∈ ℕ, ∀𝑛 ≥ 𝑛𝑜 𝑏𝑒𝑟𝑙𝑎𝑘𝑢 𝑓 𝑛 ≥ 𝑐𝑔 𝑛 Dengan demikian, 𝑓 ∈ Ω(𝑔) apabila 𝑓(𝑛) lim = ∞ 𝑎𝑡𝑎𝑢 berhingga tidak 0 𝑛→∞ 𝑔(𝑛) Definisi: 𝑓 = Θ 𝑔 , 𝑎𝑡𝑎𝑢 𝑓 ∈ Θ(𝑔) dapat diartikan bahwa f secara asimtotik naik secepat g, dan 𝑓(𝑛) didefinisikan dengan syarat bahwa 𝑔(𝑛) terbatas ke atas oleh c1>0, dan terbatas ke bawah oleh konstante c2>0 (g) dapat dinyatakan sebagai himpunan fungsi dengan sifat keanggotaan sebagai berikut: Θ 𝑔 = 𝑓|∃𝑐1, 𝑐2 > 0, 𝑛𝑜 ∈ ℕ, ∀𝑛 ≥ 𝑛𝑜 𝑏𝑒𝑟𝑙𝑎𝑘𝑢 𝑓 𝑛 ≤ 𝑐1𝑔 𝑛 , 𝑓 𝑛 ≥ 𝑐2𝑔 𝑛 𝑓(𝑛) Dengan demikian, 𝑓 ∈ Θ(𝑔) apabila lim =𝐿>0 𝑛→∞ 𝑔(𝑛) Order kompleksitas yang sering digunakan 2𝑛 adalah log log n, log n, n, 2 , 2 (log n
dengan bilangan pokok 2)
Fungsi 𝑓: ℕ ⟶ ℝ+ dikatakan mempunyai order ◦ Logaritmik jika 𝑓 ∈ 𝑂(log 𝑛) ◦ Polilogaritmik jika 𝑓 ∈ 𝑂 𝑙𝑜𝑔𝑘 𝑛 𝑢𝑛𝑡𝑢𝑘 𝑠𝑢𝑎𝑡𝑢 𝑘 ◦ Linier jika 𝑓 ∈ 𝑂(𝑛), kuadratik jika 𝑓 ∈ 𝑂(𝑛2 ) , kubik jika 𝑓 ∈ 𝑂(𝑛3 ) ◦ Kuasi-linier jika 𝑓 ∈ 𝑂(𝑛 𝑙𝑜𝑔𝑘 𝑛) untuk suatu k ◦ Polinomial jika 𝑓 ∈ 𝑂(𝑛𝑘 ) untuk suatu k ◦ Superpolinomial jika 𝑓 ∈ Ω(𝑛𝑘 ) untuk setiap k 𝑛𝜖 ◦ Subeksponensial jika 𝑓 ∈ 𝑂(2 ) 𝑢𝑛𝑡𝑢𝑘 𝑠𝑢𝑎𝑡𝑢 𝜖 > 0 𝜖 ◦ Eksponensial jika 𝑓 ∈ Ω(2𝑛 ) 𝑢𝑛𝑡𝑢𝑘 𝑠𝑢𝑎𝑡𝑢 𝜖 > 0 ◦ Strictly eksponensial jika 𝑓 ∈ 𝑂(2𝜖𝑛 ) 𝑢𝑛𝑡𝑢𝑘 𝑠𝑢𝑎𝑡𝑢 𝜖 > 0 Jika waktu komputasi bergantung lebih dari satu parameter, masih bisa digunakan notasi-notasi tersebut Misalkan 𝑓(𝑛, 𝑚) ∈ 𝑂(𝑛𝑚2 + 𝑛2 log 𝑚) jika terdapat c>0 sehingga 𝑓 𝑛, 𝑚 ≤ 𝑐 𝑛𝑚2 + 𝑛2 log 𝑚 untuk setiap 𝑚, 𝑛 ∈ ℕ Misalkan tA(x) merupakan waktu komputasi algoritma A dengan input x Membandingkan algoritma A dan A’ untuk permasalahan yang sama dilakukan dengan konsep: Algoritma A paling tidak secepat algoritma A’ apabila tA(x) tA’(x) ◦ Nilai yang eksak tA(x), dan juga perbandingan A dengan A’ tergantung model komputasi ◦ Hanya algoritma yang sederhana yang mungkin kita hitung tA(x) untuk semua input x, dan perbandingan tA(x) tA’(x) ◦ Seringkali tA(x)tA’(x) untuk x yang kecil, tetapi tA(x)≥tA’(x) untuk x yang besar