Saturday, 26 November 2016

Menghitung Kompleksitas Waktu Algoritma Rekursif

1. Algoritma Menghitung Nilai x Pangkat y
Program Pangkat
Kamus
x,y : integer

Function pangkat (x:integer, y: integer)
Algoritma
if y = 0 then
return 1
else
return x*pangkat(x,y-1)
endif
endfuction
algoritma
     input x,y
     output pangkat(x,y)

Analisis:
- Kompleksitas waktu diukur dari jumalh operasi perkalian (*)
- Jika y = 0 maka pangkat sama dengan 1 (tidak ada operasi perkalian) {basis}
     - Jika y > 0 maka,
pangkat(x,y) = x * pangkat(x,y-1) atau xy =      x * xy-1  (ada operasi perkalian) {rekurens}

- Yang mempengaruhi jumlah pemanggilan rekursif adalah nilai y atau (y-1) atau T(n-1)

T(n) = 1 + T(n-1) ; n > 0 {rekurens}
T(n) = 1 ; n = 0          {basis}
    
     T(n) = 1 + T(n-1)
           = 1 + 1 + T(n-2)
           = 2 + 1 + T(n-3)
           …
     T(n) = n + T(0)
     Jadi T(n)= n ≈ O(n)


2. Algoritma Menentukan Deret bilangan Fibonacci ke-n
Function fib (input n : integer) integer
Deklarasi
-
Algoritma
     If (n = 0) or (n = 1) then
           Return n
     Else
           Return fib(n-1) + fib(n-2)
     endif

Analisis:

- Kompleksitas waktu diukur dari jumalh operasi samadengan (=)
n = 0 atau n = 1 {basis}
fib(n-1) + fib(n-2) {rekurens}

- T(n)= 2 + T(n-1) + T(n-1) ; n > 1 {rekurens}
  T(n)= 1 ; n = 0 = 1      {basis}

  T(n-1)≈T(n-2)
  T(n)     = 2T(n-1) + 2
           = 2{2T(n-1)+2}+2
           = 4T(n-2)+6 ; k=2 , C=2
           = 8T(n-3)+14 ; k=3 , C=2
           …
  T(n)     = 2kT(n-k)+(2k-1)C
           (n-k) = 0 → k=n
  T(n)     = 2nT(0)+(2n-1)C
  T(n)     = (1+C)*2n-C
  Jadi T(n)≈ 2n ≈ O(2n)


3. Algoritma
Procedure MinMaks2(input A : TabelInt, i, j : integer, output min, maks : integer
{ Mencari nilai maksimum dan minimum di dalam tabel A yang berukuran n elemen secara Divide and Conquer. Masukan: tabel A yang sudah terdefinisi elemenelemennya Keluaran: nilai maksimum dan nilai minimum tabel }

Deklarasi
min1, min2, maks1, maks2 : integer

Algoritma
     if i=j then { 1 elemen }
min Ai
maks Ai
else
if (i = j-1) then { 2 elemen }
if Ai < Aj then
maks Aj
min Ai
else
maks Ai
min Aj
endif
else { lebih dari 2 elemen }
k ← (i+j) div 2  { bagidua tabel pada posisi k } MinMaks2(A, i, k, min1, maks1)
MinMaks2(A, k+1, j, min2, maks2)
if min1 < min2 then
min min1
else
min min2
endif
if maks1<maks2 then
maks ← maks2
else
maks maks2
endif

Analisis:
T(n) = 0; n=1 {basis}
T(n) = 1; n=2 {basis}
T(n) = 2T(n/2)+2 ; n>2 {rekurens}

Asumsi n = 2k, dengan k bilangn bulat positif, maka:
T(n) = 2T(n/2)+2
     = 2(2T(n/4) + 2) + 2 = 4T(n/4) + 4 + 2
     = 4 (2T(n/8) + 2) + 4 + 2 = 8T(n/8) + 8 + 4 + 2
     = ...           ­k-1
     = 2k – 1 T(2) +      ∑ 2i
                     i=1
     = 2k – 1  1 + 2k – 2
     = 2(2logn)-1 + 2(2logn)-2
     = n/2 + n-2
     =3n/2-2

Jadi T(n) = n = O(n)


resource : 
buku Algoritma dan Pemrograman, Renaldi Munir

1 comment:

  1. Terima kasih banyak kakak
    Saya dapat pencerahan yang bagus dari sini :)

    ReplyDelete