1 MATEMATIKA DISKRIT
KOMPLEKSITAS WAKTU
Setelah menetapkan ukuran masukan, maka langkah selanjutnya dalam mengukur
kompleksitas waktu adalah menghitung banyaknya operasi yang dilakukan oleh algoritma.
Di dalam sebuah algoritma mungkin terdapat banyak sekali jenis-jenis operasi, miaslnya
operasi penjumlahan (termasuk pengurangan), operasi perbandingan, operasi pembagian,
operasi pembacaan, pemanggilan prosedur, dan sebagainya.
Contoh 10.1
Sebagai contoh pertama, tinjau kembali Algoritma 10.1. Jenis-jenis operasi yang
terdapat di dalam algritma hitung rerata adalah
Mari kita hitung kompleksitas waktu algoritma tersebut dengan cara menghitung
masing-masing jumlahoperasi. Jika operasi tersebut berada di dalam sebuah kalang (loop),
maka jumlah operasinya bergantung berapa kali kalang tersebut diulang.
(i)
1 kali
k 1
1 kali
a
Jumlah jumlah + k ,
n kali
k k +1,
n kali
k jumlah/n),
1 kali
Operasi penjumlahan
Jumlah +
ak
k + 1,
Jumlah seluuh operasi penjumlahan adalah
t 2 =n+n=2 n
(iii)
Perasi pembagian
Jumalah seluruh operasi pembagian adalah
2 MATEMATIKA DISKRIT
n kali
n kali
Jumlah/n)
1 kali
Idealnya kita memang harus menghitung semua oprasi yang ada di dalam suatu
algoritma, seperti pada contoh 10.1 di atas. Namun, untuk alasan praktis, kita cukup
menghitung jumlah operasi abstrak yang mendasari suatu algoritma, dan memisahkan
analisisnya dari implementasi [SED92]. Operasi abstrak ini disebut operasi dasar (basic
operation). Sebagai contoh, pada algoritma pencarian, operasi abstrak yang mendasarinya
adalah operasi perbandingan x dengan lemen-elemen larik. Dengan menghitung berapa
kali operasi perbandingan elemen untuk tiap-tiap nilai n pada dua buah algoritma
pencarian, kita memperoleh kemangkusan relative dari kedua buah algoritma tersebut.
Pada algoritms pengurutan, opeasi dasar adalah operasi perbandingan elemenelemen larik dan operasi pertukaran elemen-elemen. Jadi, kita cukup menghitung berapa
kali operasi perbandingan dan berapa kali operasi pertukaran elemen di dalam algoritma
pengurutan. Kedua operasi dasar ini dihitung secara terpisah, karena di dalam algoritma
pengurutan jumlah operasi perbandingan tidak sama dengan jumlah operasi pertukaran.
Pada algoritma perkalian dua buah matriks A x B yang masing-masing berukuran n
x n, operasi dasar yang bagus untuk dipilih adalah operasi penjumlahan dan perkalian.
Jadi, kita cukup menghitung berapa kali operasi penjumlahan dan berapa kali operasi
perkalian pada algoritma dua buah matriks. Kedua operasi dasar ini dihitung secara
terpisah.
Pada algoritma evaluasi polinom,
operasi dasar di dalam algoritmanya juga operasi penjumlahan dan perkalian. Jadi, kita
cukup menghitung berapa kali operasi penjumlahan dan berapa kali operasi perkalian pada
algoritma evaluasi polinom.
Contoh 10.2
Tinjau kembali algoritma hitung rerata pada contoh 10.1. operasi yang mendasar
pada algoritma menghitung rata-rata adalah operasi penjumlahan elemen-elemen larik
ak
(yaitu operasi di dalam instruksi jumlah jumlah +
), yang mana dilaksanakan
sebanyak n kali, yaitu sejumlah pengulangan yang dilakukan. Operasi-operasi lainnya,
seperi pembagian) boleh kita abaikan (tidak dihitung). Jika kompleksitas waktu algoritma
dihitung berdasarkan jumlah operasi penjumlahan ini, maka kompleksitas waktu hitung
rerata adalah T ( n ) =n .
Contoh 10.3
Tinjau algoritma untuk mencari elemen terbesar didalam sebuah larik (array) yang
berukuran n elemen. Tentukan kompleksitas waktu algoritma, yang dalam hal ini
3 MATEMATIKA DISKRIT
kompleksitas waktu algoritma dihitung berdasarkan jumlah operasi perbandingan elemenelemen, karena perbandingan adalah operasi dasar yang digunakan di dalam algoritma
mencari nilai terbesar (operasi perbandingan i n bukan operasi perbandingan elemen
larik, jadi tidak kita hitung).
Penyelesaian:
Operasi perbandinan elemen larik yang dimaksudkan di dalam algoritma adalah A [ i ]
maks. Operasi ini terdapat di dalam kalang for. Jumlah operasi perbandingan elemen
ditenukan oleh berapa kali kalang for dieksekusi, yaitu
n1
CariMaks
(input
a1 , a2 , , an
integer,
output
a1
while i
if
ai >
maks
n do
maks then
ai
endif
i
i + 1
endwhile
{i >n }
Algoritma 10.2 algoritma mencari elemen terbesar
4 MATEMATIKA DISKRIT
10
CariMaks
dihitung
berdasarkan
operasi
perbandingan
elemen
saja,
adalah
perbandingan juga dihitung, kita akan memperoleh kebutuhan waktu yang lebih presisi.
Namun, kita tidak melakukan perhitung kebutuhan waktu yang aktual di sini.
Kompleksitas waktu T ( n ) =n1 sudah cukup memberiakn informasi mengenai unjuk
kerja algoritma. Dengan kata lain, kitamenghitung kebutuhan waktu algoritma secara
teoritis, bukan secara praktis. Lain yang harus diperhatikan dalam menghitung
kompleksitas waktu adalah parameter yang mencirikan ukuran masukan. Pada algoritma
pencarian misalnya, Waktu pencarian tidak hanya bergantung pada ukuran larik (n), tetapi
juga bergantung pada nilai elemen yang dicari (x). sebagai contoh, diketahui larik bilangan
bulat yang beranggotakan 128 buah elemen, . asumsika elemen-elemen larik sudah terurut.
Jika a=x maka waktu pencariannya 128 kali lebih cepat daripada jika a=x atau
jika x terdapat di dalam larik. Demikian pula, jika a = x maka waktu pencariannya kali
lebih cepat daripad jika a =x. karena itu, kompleksitas waktu dibedakan atas tiga macam :
1.
2.
3.
yaitu kebutuhan waktu rat-rata yang diperlukan algoritma sebagai fungsih dari n. untuk
kasus rata-rata ini, biasanya dibuat asumsi bahwa semua barisan masukan
bersifatsama. Misalnya, pada persoalan pencarian diandaikan bahwa data yang dicari
mempunyai peluang yang sama untuk terletak di dalam larik.
Contoh 10.4
Diberika larik bilangan bulat
a1 , a2 , , an
elemen ganda). Hitunglah kompleksitas waktu terbaik, terburuk, dan rat-rata dari algoritma
pencarian beruntun (sequential search) di bawah ini. Algoritma pencarian beruntun di
bawah ini menghasilkan indeks elemen yang bernilai sama dengan x. jika x tidak
ditemukan, indeks 0 akan dihasilkan (catatlah bahwa algoritma pencarian beruntun ini
merupakan versi dari algoritma pencarian beruntun yang pernah dituliskan pada Algoritma
5.4 di Bab 4).
procedure Pencarian Berurutan (input: a1 , a2 , , an
: integer, x :
integer,
{mencari x di dalam elemen
ketemu
while (1
ai
if
false
= x then
ketemu
true
else
6 MATEMATIKA DISKRIT
i + 1
endif
endwhile
{ I
n or ketemu }
else
idx
{ x tidak ketemu }
endif
Algoritma 10.3 Algoritma pencarian beruntun
Penyelesaian :
Algoritma pencarian beruntun membandingkan setiap elemen larik dengan x, mulai
dari elemen pertama sampai x ditemukan atau sampai elemen terakhir. jika x ditemukan,
maka proses pencarian dihentikan. kita akan menghitung jumlah operasi perbandingan
elemen larik yang terjadi selama pencarian (a i = x ). operasi perbandingan yang lain,
seperti i n tidak akan dihitung. operasi perbandingan elemen-elemen larik adalah abstrak
yang mendasari algoritma alagoritma pencarian.
1.
2.
3.
Kasus rata-rata : Jika x ditentukan pada posisi ke-j, maka operasi perbandingan (a i = x
) dilakukan sebanyak j kali. Jadi, kebutuhan waktu rata-rata algoritma pencarian
beruntun adalah
1
n ( 1+n )
( 1+2+3+ +n )
( n+1 )
2
Tavg(n) =
=
=
n
2
n
Cara lain yang dapat digunakan dalam menghitug Tavg diatas adalah sebagai berikut :
7 MATEMATIKA DISKRIT
1
n , atau kita tulis P ( aj = x ) =
1
n . jika aj = x
maka Tj yang dibutuhkan adalah Tj = j. jumlah perbandingan elemen larik secara rata-rata
adalah :
n
T
T
Tavg(n) =
jP(A[ j ] = X) =
j=1
j=1
1
n(n+1)
)=
n (
2
1
n
1
T
n j=1
1
n
j =
j=1
n+1
2
Contoh 10.5
Diberikan larik bilangan bulat a1 , a2, an yang telah terurut menaik (tidak ada
elemen ganda). hitunglah kompleksitas waktu terbaik, terburuk, dan rata-rata dari
algoritma pencarian biner (bynery search) dibawah ini. algoritma pencarian beruntun
dibawah ini menghasilkan indeks elemen yang bernilai sama dengan x. jika x tidak
ditemukan, indeks 0 akan dihasilkan.
prosedur pencarian biner (input a1, a2, . an integer, x : integer,
output idx : integer)
mencari x dalam elemen a1, a2, . an. lokasi (indeks elemen) tempat x
ditemukan diisi ke dalam idx. jika x tidak ditemukan, maka idx
diisi dengan 0.
masukkan : a1, a2, . an
keluaran : idx
deklarasi
i, j, mit : integer
ketemu :boolean
algoritma
I, 1
j n
ketemu false
while (not ketemu) and (i
j ) do mid ( i + j ) div 2
if amid = x then
ketemu true
else
if amid < x then (cari di belahan kanan)
I mid +1
else (cari di belahan kiri)
j mid 1
endif
endwhile
(ketemu or i > j)
if ketemu then
idx mid
else
8 MATEMATIKA DISKRIT
idx 0
endif
Penyelesaian :
Algoritma pencarian biner membagi larik dipertengahan menjdi dua bagian yang
n
berukuranm sama ( 2 bagian), bagian kiri dan bagian kanan. jika elemen pertengahan
tidak sama dnegan x, keputusan dibuat untuk melakukan penarian pada bagian kiri atau
bagian kanan. proses bagi dua dilakukan lagi pada bagian yagn dipilih. perhatikanlah
bahwa setiap kali memasuki kalang while do maka ukuran larik yang ditelusuri berkuran
menjadi setengah kali ukuran semula : n,
n
2 ,
n
4 ,
Kita akan menghitung jumlah operasi perbanddingan elemen dengan x yang terjadi
selama pencarian (a = x). opeasi perbandingan yang lain, seperti I j dan a < x
mid
mid
tidak akan dihitung. untuk penyederhanaan, asumsikan ukuran larik adalah perangkatan
dari dua (yaitu, n=2k)
1.
Kasus terbaik
Kasus terbaik adalah bila x ditemukan pada elemen pertengahan (amid), dan operasi
perbandingan elemen (amid = x) yang dilakukan hanya satu kali. Pada kasus ini
Tmin (n) = 1
2.
Kasus terburuk
Pada kasus terburuk, elemen x ditemukan ketika ukuran larik = 1. Pada kasus terburuk
ini, ukuran larik setiap kali memasuki kalang while-do adalah:
(sebanyak 2logn kali )
128
64
32
16
9 MATEMATIKA DISKRIT
jumlah
for k
0
1 to n do
jumlah + ak
endif
endfor
terburuk,
Tmax(n) = n
dan pada kasus terbaik, semua elemen genap sehingga instruksi penjumlahan jumlah
jumlah + ak tidak pernah dikerjakan, jadi
Tmin(n) = 0
Contoh 10.6
Hitung jumlah operasi perbandingan elemen larik dan jumlah operasi pertukaran
pada algoritma pengurutan seleksi (selection sort).
prosedure urut seleksi (input/output a1,a2, , an : integer)
{mengurutkan elemen-elemen a1,a2, , an dengan metoede selection
sort.
masukan: a1,a2, , an.
keluarkan : a1,a2, , an ( sudah terutut menaik ).
}
Deklarasi
i , j, imaks, temp : integer
Algoritma
for i
imaks
n downto 2 do
10 MATEMATIKA DISKRIT
for j
2 to i do
endif
endfor
{ pertukaran aimaks dengan ai }
temp
ai
aimaks
ai
aimaks
temp
endfor
Penyelesaian :
Algoritma urut seleksi terdiri dari n 1 kali pass. pada setiap kali pass, kita
mencari elemen terbesar dari elemen-elemen a1,a2, , an, lalu mempertukarkan elemen
terbesar dengan an. pass berikutnya akan mencrai elemen terbesar dari sekumpulan a 1,a2,
, an -1, begitu seterusnya sampai larik pass terakhir sehingga tinggal satu elemen yang
pasti sudah terurut. Operasi abstrak yang mendasari algoritma pengurutan adalah operasi
perbandingan elemen larik (aj > aimaks) dan operasi pertukaran ( diwakili oleh tiga buah
temp ). Kedua operasi ini kita
instruksi : temp a , a a
a
n
imaks,
imaks
i=n 1
i=n 2
i=2
T(n) = ( n 1 ) + ( n 2 ) + + 1 =
nk
k=1
n(n1)
2
Ini adalah kompleksitas waktu untuk kasus terbaik dan terburuk, karena algoritma
urut seleksi tidak bergantung pada data masukan apakah sudah terurut atau acak.
11 MATEMATIKA DISKRIT
(ii)
n(n 1)
2
buah operasi
xi
i=1
n n
j=n , [ ] , [ ] ,
2 4
n
2 ,
n
4 , , 1
1 do
for I 1 to j do
x x * i
endfor
j d div 2
endwhile
{ j > 1}
jumlah x
Penyelesaian :
Untuk
j = n, jumlah operasi perkalian = n
j = n/2, jumlah operasi perkalian = n/2
j = n/4, jumlah operasi perkalian = n/4
n+
n
2 +
n
4 ++2+1
2 log n1
n ( n1 ) x
1
1
2
= 2( n 1 )
2
Pada kasus ini , T(n) tumbuh seperti n tumbuh.
2
2
T(n) =2 n +6n +1
n2
10
261
100
100
2061
10.000
13 MATEMATIKA DISKRIT
1000
2.006.001
1.000.000
10.000
2000.060.001
1.000.000.000
Jika diperhatikan pada table 10.1 tersebut , suku 6n + 1 menjadi tidak berarti di
bandingkan
2n
2n
2
T(n) = O ( n )
2
n2
yang tumbuh
pada kecepatan yang sama dengan T(n). Notasi O disebut notasi O-Besar (Big O) yang
merupakan salah satu dari tiga notasi kompleksitas waktu asimpsotik . definisi formal
notasi O-Besar dituliskan dibawah ini.
Notasi O-Besar
DEFINISI 10.1. T(n) = O(f(n)) (dibaca T(n) adalah O(f(n)) yang artinya T(n) berorde
14 MATEMATIKA DISKRIT
tetapi untuk n 5
n2 +5n = O( n2 )
Dari definisi O-Besar jelas menuliskan T(n) = O(f(n)) tidak sama dengan O(f(n)) =
T(n). lagi pula , tidaklah bermakna apa-apa menyatakan O(f(n)) = T(n). penggunaan
symbol = tidak menguntungkan karena symbol ini sudah umum menyatakan
kesamaan. Kebingungan yang timbul dari penggunaan symbol ini dapat dihindari
dengan membaca symbol = sebagai adalah dan bukan sama dengan [HOR90].
Untuk menunjukkan bahwa T(n) = O(f(n)) kita hanya perlu menemukan pasangan
C dan no sedemikian sehingga T(n) C(f(n)). Tetapi , perlu diingat bahwa pasangan C
dan no yang memenuhi definisi di atas tidak unik . ada banyak C dan n o yang memunihi
definisi ini. Contoh-contoh berikut memperlihatkan cara memperoleh notasi kompleksitas
asimptotik untuk bermacam-macam T(n).
Polinimial n derajat m dapat digunakan untuk memperkirakan kompleksitas waktu
asimptotik . suku berorde rendah dalam ekspresi T(n) dapat diabaikan dalam menetukan
3
O( n
1
2
), T(n) =
+6 n
2
= O( n
+ n +8 = O( n
), T(n) = 2 n
+6n + 1 =
[HOR90].
TEOREMA 10.1 . bila T(n) = am nm + am-1 nm-1 ++a1n+a0 adalah polinom derajat m maka
T(n) = O(nm).
Bukti :
m
T(n)
aini
i=0
nm
a i n im
nm
ai
i=0
i=0
ai .
i=0
suku yang dominan untuk n yang besar . dalam menentukan kompleksitas waktu
asimptotik, perhatian kita tertuju pada suku yang dominan itu.
Besaran dominan lainnya adalah :
-
Semua logaritma tumbuh padlaju yang sama (yaitu nlog (n) = blog (n),
2
N log n tumbuh lebih cepat daripada n tetapi lebih lambat daripada n .
ln n),
2
Perhatikan bahwa kita juga dapat menyatakan bahwa 2 n
2
karena 2 n
3
2 n
+6n +1
3
9 n
untuk semua n
2
menyatakan 2 n
untuk semua n
2
+6n +1 = O( n )
2
1, atau 2 n
+6n +1
4
+6n +1 = O( n ), dan seterusnya. Jadi, bila T(n) = O(f(n)),
dan g(n) adalah fungsi yang nilainya lebih besar dari f(n), maka T(n) = O(g(n)). Ini
berarti, fungsi f(n) pada notasi T(n) = O(f(n)) dapat diganti dengan fungsi lain
yang lebih besar [ROS99]. Namun, agar notasi O-Besar memilki makna, maka
untuk alas an lebih praktis , fungsi f di dalam notasi T(n) = O(f(n)) dipilih fungsi
yang sekecil mungkin, biasanya dari fungsi acuan seperti 1, log n,
n2 ,
n3 ,
2
,2n,n!. jadi, jika suatu algoritma memilki kebutuhan waktu T(n) = 2 n +6n +1,
2
3
4
kompleksitas waktunya ditulis O( n ), bukan O( n ), O( n ), dan
seterusnya.
Teorema O-Besar
TEOREMA 10.2 misalkan T1(n)= O(f(n)) dan T2(n) = O(g(n)), maka
f(n) = O(f(n)
Perhatikan di dalam teorema 10.2 bahwa T 1(n) + T2(n) diberkan dlam dua rumus
yang berbeda, hal ini karena notasi O Besar adalah mekanisme untuk menemukan batas
lebih atas untuk laju pertumbuhan kompleksitas waktu algoritma dan bukan batas lebih
atas yang paling kecil [AZM88]. Keduanya digunakan dalam konteks yang berbeda.
Kompleksitas waktu asimptotik suatu algoritma dapat ditentukan dengan salah satu dari 2
cara dibawah ini:
1
Cara I
Jika kompleksitas waktu T(n) dari algoritma sudah dihitung , maka
kompleksitas waktu asimptotiknya dapat langsung ditentukan dengan mengmbil
suku yang mendominasi fungsi t dan menghilangkan koefisiennya. Cara ini
bersuaian denga teorema 10.2.
contoh:
i
ii
iii
iv
(n+1)
= O(n2),
2
(semua notasi O-Besar pada (i), (ii), (iii), dan (iv) di atas didasrkan pada
jumlah perbandingan elemen-elemen larik)
v
vi
17 MATEMATIKA DISKRIT
(Teorema 10.2(b))
(Teorema 10.2 (a))
= O(n2)
2
Cara II
Umumnya menghitung kompleksitas waktu untuk kasus terbaik dan khusus ratarata sangat sulit dilakukan. Hal ini disebabkan informasi tentang probabilitas setiap
permutasi data masukan yang berukuran n tidak diketahui atau tidak dapat
ditentukan. Karena itu cukup beralasan kalau kita hanya meninjau kompleksitas
waktu terburuk saja. Di bawah ini diberikan beberapa aturan untuk menghitung
kompleksitas waktu asimptotik untuk kasus terburuk [AZM88]. Di dalam aturan
tersebut kita tidak menghitung jumlah pelaksanaan operasi dasar sebagaimana pada
perhitungan T(n), tetapi kita menghitung langsung dengan menggunakan notasi OBesar:
a
Case A
A = a1 : S1
A = a2 : S2
A = an : Sn
Endcase
18 MATEMATIKA DISKRIT
digunakan
teknik
perhitungan
Nama
O(1)
O(log n)
O(n)
O( n log n)
O(n2)
O(n3)
O(2n)
O(n!)
Konstan
Logaritmik
Lanjar
n log n
kuadratik
kubik
eksponensial
faktorial
O ( f ( n ) ) terletak sebulum
O( f (n))
O ( f ( n ) ) dan
sejumlah konstanta. Algoritma yang termasuk kelompok ini adalah algoritma yang
kebanyakan instruksinya dilaksanakan satu kali atau paling banyak beberapa kali.
Contohnya prosedur tukar di bawah ini.
Procedur tukar atau (input/output a, b : integer)
(mempertukarkan nilai a dan b. setelah pertukaran, a berisi
nilai b dan b berisi nilai a semula
Masukan : a dan b
Keluaran ; a dan b
Deklarasi :
Temp : integer
Algoritma
Temp a
a b
btemp
O(log n) kompleksitas logaritmik berarti laju pertumbuhan waktunya berjalan lebih lambat
dari pada pertumbuhan n. Algoritma yang termasuk kelompok ini adalah
algoritma yang memecahkan persoalan besar dengan mentransformasikannya
menjadi masalah yang lebih kecilyang berukuran sama (misalnya algoritma
pencarian biner). Disini basis algoritma tidak terlalu penting sebab bila n
dinaikkan dua kali semula, misalnya, log n meningkat sebesar sejumlah konstanta.
Fungsi log n hanya meningkat dua kali jika n dinaikan sebesar n2 kali semula
(basis dua).
O(n) Algoritma yang waktu pelaksanaanya lanjar umumnya terdapat pada kasus yang
setiap elemen masukannya dikenai proses yang sama, misalnya algoritma
pencarian_beruntun. Bila n dijadikan dua kali semula , maka waktu pelaksanaan
algoritma juga dua kali semula.
O(n log n) waktu pelaksanaan yang n log n terdapat pada algoritma yang memecahkan
persoalan menjadi persoalan yang lebih kecil. Menyelesaikan tiap persoalan
secara independen, dan menggabung solusi masing-masing persoalan. Algoritma
yang diselesaikan dengan tekhnik bagi dan gabung mempunyai kompleksitas
asimptotik jenis ini. Bila n=1000, maka n log n mungkin 20.000. Bila n
dijadikan dua kali semula, maka n log n menadi dua kali semua (tetapi tidak
terlalu banyak)
O(n2) Algoritma yang waktu pelaksanaanya kuadratik hanya prktis digunakan untuk
persoalan yang berukuran kecil. Umumnya algoritma yang termasuk kelompok ini
memeproses setiap masukan dalam dua buah kalang bersarang, misalnya pada
algoritma urut_maks. Bila n=1000, maka waktu pelaksanaan algoritma adalah
1.000.000. Bila n dinaikkan dua kali semula, maka waktu pelaksanaan algoritma
meningkat menjadi empat kali semula.
O(n3) seperti halnya algoritma kuadratik, algoritma memproses setiap masukan dalam tiga
buah kalang bersarang, misalnya algoritma perkalian matriks. Bila n=100, maka
waktu pelaksanaan algoritma adalah 1.000.000. Bila n dinaikkan dua kali semula,
waktu pelaksanaan algoitma meningkat menjadi delapan kali semula
20 MATEMATIKA DISKRIT
O(2n) Algoritma yang termasuk kelompok ini mencari solusi persoalan secara brute
force, misalnya pada algoritma mencari sirkuit Hamilton. Bila n=20, waktu
pelaksanaan algoritma adalah 1.000.000. Bila n dijadikan dua kali semula, waktu
pelaksanaan meningkat menjadi kuadrat kali semula.
O(n!) Seperti halnya pada algoitma eksponensial, algoritma jenis ini memproses setiap
masukan dan memnghubungkannya dengan n-1 masukan lainnya, misalnya
algoritma persoalan pedagang keliling (Trafelling salesperson problem). Bila n n=5 ,
maka waktu pelaksanaan algoritma adalah 120. Bila n dijadikan dua kali semula,
maka waktu pelaksanaan menjadi factorial dari 2n
Enam buah notasi orde yang pertama O(1) sampai O(n 3, adalah orde algoritma yang
penting. Disini kebutuhan waktunya dibatasi oleh polinomial , dan algoritmanya
dinamakan algoritma polinomial. Algoritma yang komplektisitas waktu asimptotiknya
O(2n) dinamakan algoritma eksponensial, karena bila n diperbesar, kebutuhan waktunya
meningkat dengan tajam. Algoritma yang kebutuhan waktunya O(2n) tidak dapat dikatakan
polinomial karena tidak ada bilangan bulat m sehingga sedemikian sehingga polinom n m
membatasi 2n. atau 2m O(nm) untuk sebarang bilangan bulat m. algoritma yang kebutuhan
waktunya O(n!) juga digolongkan sebagai algoritma eksponensial karena pertumbuhan
waktunya mempunyai kemiripan dengan fungsi 2n
tabel 10.3 dibawah ini memperlihatkan bagaimana kebutuhan waktu untuk ketujuh fungsi
kompleksitas waktu tumbuh ( diandaikan konstanta atau koefisien de depan persamaannya
adalah satu)
Tabel 10.3 nilai masing masing fungsi untuk
bermacam nilai n
Log n
n log n
n2
n3
2n
n!
0
1
2
3
4
5
1
2
4
9
16
32
0
2
8
24
64
160
1
4
16
64
256
1024
1
8
64
512
4096
32768
2
4
16
256
65536
4294967296
1
2
24
362880
20922789888000
(terlalu besar untuk ditulis)
Tabel 10.4 memperlihatkan waktu eksekusi algoritma yang kompleksitas waktunya adalah
fungsi-fungsi acuan, yaitu
3
f ( n )=n
, dan
f ( n )=2
f ( n )=n ,
f ( n )=log n ,
f ( n )=n log n ,
f ( n )=n2 ,
dasar pada setiap algoritma membutuhkan satu waktu nanodetik (10 -9 detik). Tabel
tersebut memperlihatkan hasil yang mengejutkan. Orang mungkin berharap selama
algoritmanya bukan algoritma eksponensial, ia merupakan algoritma yang memadai.
Tetapi, algoritma kuadratik membutuhkan waktu 31,7 tahun untuk memproses informasi
sebanyak satu billion, sedangkan algoritma O ( n log n ) membutuhkan waktu hanya 29,9
detik untuk memproses masukan sebanyak itu. Sebuah algoritma sebaiknya
21 MATEMATIKA DISKRIT
O ( n log n )
atau kita mengasumsikan bahwa algoritma dapat memproses masukan yang berukuran
sangat besar dalam waktu yang dapat ditoleransi.hal ini tidaklah berarti bahwa algoritma
yang kompleksitas waktunya lebih tinggi tidak berguna. Algoritma dengan kebutuhan
waktu kuadratik, kubik, dan yang lebih tinggi sering berguna untuk memproses masukan
pada berbagai aplikasi[NEA96]
Tabel 10.4 waktu eksekusi algoritma dengan berbagai macam kompleksitas waktu.
n
f(n)=log n
F(n)=n
F(n)= n log n
F(n)=n2
F(n)=n3
F(n)=2n
10
0,003 s
0,01 s
0,033 s
0,1 s
1 s
1 s
20
0,004 s
0,02 s
0,086 s
0,4 s
8 s
1 ms
30
0,005 s
0,03 s
0,147 s
0,9 s
27 s
1s
40
0,005 s
0,04 s
0,213 s
1,6 s
64 s
18,3 menit
50
0,006 s
0,05 s
0,282 s
2,5 s
125 s
13 hari
102
0,007 s
0,10 s
0,664 s
10 s
1 ms
4.1013 tahun
103
0,010 s
1,00 s
9,966 s
1 ms
1s
104
0,013 s
10 s
130 s
100 ms
16,7 menit
10
0,017 s
0,10 ms
167 ms
10 s
11,6 hari
106
0,020 s
1 ms
19,93 ms
16,7 menit
31,7 tahun
10
0,023 s
0,01ms
0,23 s
1,16 hari
31,709
tahun
108
0,027 s
0,10 s
2,66 s
115,7 hari
109
0,030 s
1s
29,90 s
31,7 tahun
Keterangan
1s= 10-6 second
1 ms= 10-3 second
Sekarang tinjau secara khusus algoritma yang kebutuhan waktunya eksponensial,
algoritma eksponensial tumbuh sangat cepat dengan bertambahnya nilai n. Algoritma
eksponensial hanya bagus untuk nilai n yang sangat kecil, bahkan bila kita menurunkan
nilai koefisien didepannya, pengurangan kebutuhan waktunya tidak memiliki banyak
kemajuan. Agar lebih jelas mengapa perubahan koefisien atau konstanta dari pada
perubahan orde menghasilkan sedikit perbaikan dalam perubahan waktu pelaksanaan
program kita dapat melihatnya pada contoh dibawah ini.
Misalkan orde dari dua buah algoritma adalah O(n2 . 2n) dan O(n . 2n). kedua
algoritma adalah eksponensial, tetapi fungsi kompleksitas algorima yang pertama memiliki
faktor tambahan dibanding yang kedua. Koefisien didepan persamaannya diandaikan
sama dengan satu. Untuk bermacam-macam nilai n, nilai setiap fungsi ditunjukan pada
table 10.5. Dengan menggunakan andaian bahwa satu buah operasi memakan waktu0,001
detik. Kita menemukan bahwa untuk n=30 kebutuhan waktu algoritma pertama adalah 8,9
jam dan algoritma kedua8,9 hari. Meskipun faktor tambahan n membuat perbedaan yang
22 MATEMATIKA DISKRIT
n2. 2n
n . 2n
5
10
15
20
30
160
10240
491520
20971520
3.2 . 1010
800
102400
7372800
419430400
9,6 . 1011
Perlu diingat sekali lagi bahwa kompleksitas waktu asimptotik f(n)- hanya ukuran
kasar kebutuhan waktu pelaksanaan sebuah algoritma untuk n yang besar, jadi bukan
waktu yang sebenarnya. Notasi O_Besar mengekspresikan berapa waktu yang
dibutuhkan untuk menyelesaikan masalah dengan meningkatkan ukuran masukan.
Jika kita ingin mengukur kebutuhan waktu yang lebih persis, kita juga harus
membandingkan koefisien dengan konstanta dalam persamaan T(n)_nya. Sebagai
misal, meskipun T(n)=1000n log n dan T(n)=(n log n)/10 sama sama berorde O(n log
n), tetapi T(n)=(n log n)/10 lebih cepat untuk n yang besar. Contoh lainnya, andaikan
algoritma A membutuhkan waktu T(n)=300n dan algoritma B membutuhkan waktu
T(n)=5n2.Untuk ukuran masukan berukuran n=5, algoritma A membutuhkan waktu
1500 satuan waktu dan algoritma B membutuhkan waktu 125 satuan waktu. Jadi,
untuk ukuran masukan yang lebih kecil algoritma B lebih cepat dari algoritma A .
Tentu saja algorima A lebih cepat daripada algoritma B untuk n yang besar.
Algoritma II T(n)=n2=O(n2)
Terlihta untuk n>2 algoritma I yang yeng berorde O(n) paling cepat waktu
pelaksanaannya dibanding dengan algoritma II yang berorde O(n2). Jadi algoritma I
cepat untuk n>2.
Contoh (b) Aalgoritma I I T(n)=104 n =O(n)
Aalgoritma II
T(n)=102 n =O(n2)
Terlihat, untuk n< 104 algoritma II paling cepat. Tetapi untuk n>104 algoritma I yang
paling cepat.
3
Suatu masalah dikatakan tractable (mudah dari segi komputasi) jika ia dapat
diselesaikan dengan algoritma yang mempunyai kompleksitas polinomial kasus
terburuk (artinya dengan algoritma yang mangkus), karena algoritma akan
menghasilkan solusi dalam waktu yang lebih pendek[ROS99]. Sebaliknya, sebuah
masalah dikatakan intractable (sukar dari segi komputasi) jika tidak algoritma yang
mangkus untuk menyelesaikannya. Untuk menunjukan bahwa suatu masalah
tractable kita cukup menunjukan ada algoritma yang mangkus untuk
menyelesaikan masalah itu. Sebagi contoh, masalah menentukan nila imasksimum,
masalah pencarian, masalah pengurutan, adalah masalah yang tractable karenas
algoritmanya mempunyai kompleksitas waktu polinom untuk kasus terburuk.
Untuk menunjukan bahwa suatu algoritam Intractble, kita harus menunjukan
bahwa tidak ada algoritma yang mangkus untuk menyelesaikannya. Maslah TSP
(Travelling Salesperson Problem)_ adalah contoh masalah yang belum dapat
diselesaikan dengan algoritama polinomial, karena itu interctable. Namun orang
belum mampu membuktikan bahwa algoritma yang mangkus untuk menyelesaikan
masalah itu tidak mungkin ada. Algoritma yang ada untuk menyelesaikan masalah
intractable, seperti TSP itu, mempunyai komplesitas eksponensial.
24 MATEMATIKA DISKRIT
solusinya dapat diperiksa dalam waktu polinomial. Masalah yang solusimya dapat
diperiksa dalam waktu polinomial dikatakan termasuk kedalam kelas NP(nondeterministic polynomial). Masalah yang tractable termasuk kedalam kelas
P(polynomial). Jenis kelas masalah yang lain adalah kelas NP_lengkap(NPComplete). Kelas masalah NP_lengkap memiliki sifat bahwa jika jika ada
sembarang masalah didalam kelas ini dapat dipecahkan dalam waktu polynomial
berarti semua masalah dalam kelas tersebut dipecahkan dalam waktu poloinomial.
Atau , jika dapat membuktikan semua masalah dalam kelas tersebut intractable.
Meskipun banyak penelitan telah dilakukan, tidak ada algoritma dalam waktu
polynomial yang dapat memecahkan masalah di dalam kelas NP- lengkap. Secara
umum diterima, meskipun tidak terbuktikan, bahwa tidak ada masalah di dalam
kelas NP lengkap yang dapat dipecahkan dalam waktu polynomial [ROS99]
7
n
n log
o( n ) , tetapi
T (n) ,
tetapi tidak memberikan batas bawah (lower bound). Untuk itu, kita mendefinisikan batas
yang lebih bawah ( lower bound) untuk kompeksitas waktu, yang dilambangkan dengan
Omega-besar ( ( Big) definisi -Besar adalah
25 MATEMATIKA DISKRIT
DEFINISI 10.2
T ( n ) = ( g ( n ) )
dibaca T (n)
g(n)
adalah omega
sehingga
T ( n ) C . f ( n)
Untuk
n n0
(dibaca T ( n )
adalah tetha
h ( n ) yang artinya
Contoh
2
Tentukan notasi dan untuk T ( n ) =2 n + 6 n+1
Penyelesaian
Karena
2 n2+ 6 n+1 2 n2
untuk
2 n2+ 6 n+1=(n2 )
memperoleh
2
2
2
2
2
2
Karena 2 n + 5 n+1=O(n ) dan 2 n + 6 n+1=(n ) , maka 2 n + 6 n+1=(n )
Contoh
3
2
Tentukan notasi O, , dan untuk T ( n ) =5 n +6 n log n
Penyelesaian
Karena
0 6 n2 logn 6 n3 , maka
5 n3 +6 n2 log n 11 n 3
untuk
n 1 . Dengan
5 n +6 n log n 5 n
untuk
memperoleh
5 n3 +6 n2 log n=(n3 )
26 MATEMATIKA DISKRIT
n 1
5 n3 +6 n2 log n=O(n3)
Karena
dan
5 n3 +6 n2 log n=(n3 ) ,
maka
Besar
untuk n 1
untuk
1+2++n
karena batas
bawah n tidak sama dengan batas bawah n2. Satu cara untuk mendapatkan batas bawah
yang sama dengan batas atas adalah dengan menghilangkan setengah pertama dari sukusuku deret. Dengan menjumlahkan hanya suku suku yang lebih besar dari
n
[ ]
2 , kita
mendapatkan
1+2++n
[]
n
+ ( n1 )+ n
2
[ ] [ ][ ]
n
n
n
+ + +
2
2
2
[ ][ ]
n+1 n
2
2
n2 / 4
teorema berikut
27 MATEMATIKA DISKRIT
(n 4 ) , dan
m1
T ( n ) =am n + am1 n
++a 1 n+ a0
n(n1) n2 n
= . Menurut teorema 10.3, akgoritma ini berorde n2. Jadi,
2
2 2
2
2
kompleksitas asimptotik pengurutan seleksi adalah O(n2), (n ) dan (n )
28 MATEMATIKA DISKRIT