Fibonacci
Search adalah pencarian sebuah elemen dalam sebuah array satu dimensi
dengan menggunakan angka Fibonacci sebagai titik-titik (index) elemen array yang isinya
dibandingkan dengan nilai yang dicari (misal N).
Sama dengan Binary Search, Fibonacci Search menyaratkan data sudah urut baik
menaik maupun menurun. Dibandingkan dengan Binary Search, jumlah langkah pada
Fibonacci Search dalam memeriksa suatu nilai adalah lebih banyak, hanya
keuntungan Fibonacci Search, prosesnya hanya menggunakan operasi
tambah dan
kurang yang memerlukan waktu
jauh lebih cepat dibandingkan dengan proses
pembagian seperti yang digunakan pada Binary Search.
Contoh
Sudah ada array satu dimensi yang dibuat dengan int A[16].Sudah ada
:
isinya urut menaik. A[0] tidak diisi, A[1] sampai dengan A[15] isininya
sebagai berikut :
0
10
11
12
13
12
15
17
19
22
25
27
32
35
37
40
14
45
15
53
Susun algoritma untuk menginput sebuah nilai, (misal N) kemudian memeriksa dengan
cara atau metoda Fibonacci Search apakah ada isi array yang sama dengan nilai N. Bila
ada cetak perkataan ADA, sedangkan bila tidak ada maka cetak perkataan TIDAK ADA.
Contoh, untuk isi array yang diilustrasikan
diatas.
Bila diinput untuk N = 25, maka tercetak ADA.
Bila diinput untuk N = 10, maka tercetak TIDAK ADA
Jawab :
Fibonacci Search, memanfaatkan nilai nilai yang ada dalam Deret Fibonacci (Fibonacci
number). Deret Fibonacci adalah deret yang nilai suatu suku sama dengan jumlah nilai dua
buah suku sebelumnya, atau :
Fn = Fn-1 + Fn-2
untuk n >= 2 ,
n adalah nomor suku dimulai dari nomor 0
dan
seterusnya
1 2 3 5 8 13 21 34 dan
seterusnya
Bagian ini yang dimanfaatkan dalam Fibonacci Search
Untuk contoh data diatas, maka nomor index yang dalam lingkaran adalah index yang
nilainya sama dengan nilai deret Fibonacci.
Nomor-nomor inilah yang dipakai sebagai titik-titik utama pemeriksaan.
0
12
4
15
5
17
19
22
378
3783
8
25
10
27
32
11
35
12
37
13
14
15
40
45
53
12
4
15
5
17
i=1
p=1
q=0
1 5
q=0
p=1
25
10
27
32
11
12
35
37
13
14
15
40
45
53
Kebetulan m = 3,
3 12
p=1
22
25
i=7
p=1
q=1
i=8
p=3
q=2
7 22
8 25
5 17
2 7
19
q=3
i=5
p=3
q=2
i=2
p=1
q=1
Akar i=8
p=5
Urutan
proses
bila
diiulustrasikan dengan
pohon biner
i=3
p=2
q=1
4 15
q=0 p=1
i=6
p=1
q=0
6 19
q=0
p=1
i=9
p=1
q=0
i=11
p=5
q=3
14 45
5 i=1
i=10
p=1
q=1
p=1
q=0
10 32
9 27
q=0
p=1
Catatan :
Gambar pohon diatas, bukan berarti data yang ada didalam array
satu dimensi dijadikan pohon biner. Pohon biner hanya digunakan
untuk menggambarkan ilustrasi proses. Sebagai contoh, untuk
mencari nilai N = 19, maka titik-titik yang dilalui adalah : 8, 5, 7, 6,
dan ditemukan pada titik 6.
i=14
p=2
q=1
11 35
p=1
13
40
12 37
q=0
15 53
q=0 p=1
p=1
Maksud gambar
Index elemen array
5
17
Isi elemen
array
tersebut
n = 15, diambil angka Fibonacci 8 sebagai titik awal penelusuran karena dari
1 sampai 15 , angka 8 yang kira-kira berada di tengah. Jadi A[8] adalah titik pertama
yang diperiksa. Cara mencari titik 8 akan dijelaskan kemudian.
Untuk
Konsep diatas, bila diterapkan dalam langkah-langkah algoritma dapat dibuat sebagai berikut :
Menyiapkan parameter-parameter.
TAHAP - I.
A[ ]
12
15
Fk-3
17
19
22
p=5
8
2.
27
11
35
12
37
13
40
14
45
15
53
16
Fk= 13
yaitu angka
Fibonacci
yang terdekat
dengan
nilai n+ 1 = 16
Menyiapkan data
g;
Fk-1
Fk-2
Cari nilai Fk-1 dan Fk-2 dan Fk-3
nyatakan nilai
i dengan Fk-1,
p dengan nilai
Fk-2
q dengan nilai
Fk-3
sehingga didapat:
Fk
3.
10
32
Fk-1
Fk-2
25
m=3
= 13
Fk-1 = 8
i = 8
Fk-2 = 5
p = 5
Fk-3 = 3
q = 3
i, p, q, dan m
FK
FK1
FK2
FK3
clrscr();
n = 15;
F0 = 1; F1 = 1; Fibo = 1;
j = 1;
while(Fibo <= n+1)
{ FIBO[j] = Fibo;
Fibo = F0+F1; F0=F1; F1=Fibo;
j++; }
s = j - 1;
=
=
=
=
FIBO[s];
FIBO[s-1];
FIBO[s-2];
FIBO[s-3];
i = FK1;
p = FK2;
q = FK3;
m = (n+1) - FK;
sebagai
titik
awal
381
3813
pencarian.
TAHAP - II.
Menentukan nilai index i sebagai titik awal pemeriksaaan
(search) Sebelumnya sudah didapat nilai i = 8, sehingga
A[ i ] adalah 25, Periksa nilai yang akan dicari (misal N)
scanf("%d", &N);
if(N > A[i])
i = i + m;
12
p=5
10
15
17
19
22
25
27
32
Fk-3
Fk-2
Fk-1
11
35
12
37
m=3
13
40
14
45
15
53
16
Fk= 13
yaitu angka
Fibonacci
yang terdekat
dengan nilai
n+ 1 = 16
- Bila p != 1, maka i = i +
q (maju sebanyak q)
p
=
p
q
q
=
q
p
kemudian
ulangi
mengerjakan
loop
Flag = 0;
while( i != 0 && Flag == 0)
{if(N == A[i]) Flag = 1;
else
if(N < A[i])
{if(q == 0) i = 0;
else { i = i - q;
t = p;
p = q;
q = t - q;
}
}
else
{ if(p==1)
i = 0;
else
{ i = i + q;
p = p q;
q = q - p;
}
}
}
if(Flag == 1)
printf("\nFOUND");
else printf("\nNOT FOUND" );
}
q=
3
3
15
12
Fk-3
5
7
17
19
22
8
11
25
Pintu masuk
untuk N <= 25
= 13
Fk-1 =
=8
Fk-2 =
=5
Fk-3 = 3
= 3
27
TAHAP - II.
i=2
p=1
q=1
N=
19
A[ i ] = A[ 8 ] = 25
i=1
p=1
q=0
N < 25
tetap = 8
3 12
4 15
1 5
q=0
p=1
q=0 p=1
i=6
p=1
q=0
q=0
p=1
45
15
53
i=8
p=5
q=3
Kebetulan m =
3,
i=11
p=5
q=3
i=8
p=3
q=2
Pintu masuk
untuk N > 25
i=14
p=2
q=1
11 35
8 25 i=10
p=1
7 22
6 19
14
40
25
i=7
p=1
q=1
5 17
2 7
37
13
16
Fk
i=5
p=3
q=2
i=3
p=2
q=1
12
35
32
Akar
m = (15 + 1) - 13
= 3
10
Fk-1
Fk-2
TAHAP - I didapat :
Fk
p=5
14 45i=15
q=1
i=9
p=1
q=0
10 32
9 27
p=1
p=1
q=0
q=0
p=1
p=1
13
40
12 37
q=0
15 53
q=0 p=1
p=1
TAHAP - III
Proses
Akar i=8
p=5
q=3
8 25
i=5
p=3
q=2
5 17
i=3
p=2
q=1
3 12
4 15
q=0
7 22
i=6
p=1
p=1
q=0
i=7
p=1
q=1
6 19
q=0
p=1
i = 8, A[8] = 25
Langkah - 1. N < 25
cari ke kiri :
q != 0
i=i- q
19
8-3=5t=p
t= 5
p=q
q = tq
i = 5, A[5] =
=2
17
Langkah - 2. N > 17 cari ke kanan :
19
i = 7, A[7] =
22
Langkah - 3.
19
i = 6, A[6] =
19
p != 1
i=
p= 3
q=5-3
i=i+ q
i=5
+2=7p=p-q
p= 3-2=1q =q-p
q=2-1=1
N < 22
cari ke kiri :
q != 0
i=i- q
=6
t=p
p=q
q = tq
0
i=7-1
t= 1
p= 1
q=1-1=
Langkah - 4. N = 19
19
12
p=5
10
11
12
13
14
15
15
17
19
22
25
27
32
35
37
40
45
53
Fk-3
Fk-2
Fk-1
16
Fk
TAHAP - I didapat :
Fk
= 13
FIBO[]
Fk-1 =
=8
Fk-2 =
=5
Fk-3 = 3
13
Fk
Fk-3
Fk-2
Fk-1
= 3 m = (15 + 1)
- 13 = 3
TAHAP - II.
N = 20
A[ i ] = A[ 8 ] = 25
N < 25
tetap = 8
i = 8, A[8] = 25
Langkah - 1. N < 25
cari ke kiri :
Akar i=8
p=5
q=3
8 25
i=5
p=3
q=2
5 17
i=3
p=2
q=1
3 12
i=6
p=1
q=0
4 15
q=0
i=7
p=1
q=1
7 22
6
i = 5, A[5] =
17
Langkah - 2. N > 17
20
i = 7, A[7] =
22
Langkah - 3. N < 22
20
19
p=1
i = 6, A[6] =
19
Langkah - 4. N > 19
20
3831
q != 0
3=5
i=i- q
t=p
p=q
q = tq
=2
i=8t= 5
p= 3
q=5-3
cari ke kanan :
p != 1
i=i+ q
i=5
+2=7p=p-q
p= 3-2=1q =q-p
q=2-1=1
cari ke kiri :
q != 0
i=i- q
7-1=6t=p
t= 1
p=q
q = t-q
1=0
cari ke kanan :
i=
p= 1
q=1-
p=1
20 Tidak ditemukan
sampai dengan langkah
terakhir (pada langkah
ke-4) dan proses
selesai.
3831
12. 7
3
12
p=5
10
15
17
19
22
25
27
32
Fk-3
11
35
12
13
37
Fk-1
Fk-2
15
16
53
Fk
FIBO[]
14
45
40
13
Fk
i = 8
p = 5
Fk-3
q = 3
m =3
TAHAP - II.
Fk-2
Fk-1
N = 45
A[ i ] = A[ 8 ] =
25
N > 25
:
11 35
i=8
p=3
q=2
i , dibuat menjadi
i = i+m = 8+3 = 11
i=14
p=2
q=1
14 45i=15
8 25
i=9
p=1
q=0
i=10
p=1
q=1
10 32
9 27
p=1
q=0
13
40
12 37
15 53
q=0
p=1
i=11
p=5
q=3
Langkah - 1.
i=14
p=2
q=1
13
40
12 37
p=1
N > 35
45
14 45
i=13
p=1
q=1
q=0
q=0
p=1
i = 11, A[11] =
35
11 35
i=12
p=1
q=0
p=1
p != 1
i=15
p=1
q=0
15 53
q=0 p=1
cari ke kanan :
i=i+ q
p=p-
i = 11 + 3 =
14
p= 53
qq =q
=2q=3
-p
2=1
i = 14, A[14] = 45
Langkah - 2. N = 45
45
384
3843
12. 8
4
12
15
q=3
5
17
Fk-3
19
Fk-2
22
p=5
8
10
25
27
12
13
35
37
40
Fk-1
14
15
45
16
53
Fk
FIBO[]
32
11
13
Fk
i = 8
Fk-3
p = 5
q = 3
m =3
TAHAP - II.
Fk1
A[ i ] = A[ 8 ] =
25
N > 25
11 35
i=8
p=3
q=2
N = 27
i=14
p=2
q=1
8 25
14 45i=15
i=10
p=1
q=1
dibuat menjadi :
i +
Fk-2
i=9
p=1
q=0
m = 8 + 3 = 11
10 32
9 27
q=0 p=1
p=1
q=0
13
40
12 37
15 53
q=0 p=1
q=0 p=1
N < 35
27
11 35
i=8
p=3
q=2
8 25
35
Langkah - 1.
i = 8, A[8] = 25
Langkah - 2. N > 25
i=10
p=1
q=1
27
10 32
i=9
p=1
q=0
9 27
i = 10, A[10]
=32
Langkah - 3. N < 32
27
=9
q=0
p=1
cari ke kiri :
q != 0
i=i- q
t=p
p=q
q = tq
i = 11 - 3
t==8 5
p= 3
q=5-3=
2
cari ke kanan :
p != 1
i=i+ q
= 10
p=p-q
1
q =q-p
q=2-1=1
cari ke kiri :
q != 0
i=i- q
i = 10 - 1
i=8+2
p= 3-2=
t=p
t= 1
p=q
p= 1
q = t-q
q=1-1=
0
Terlihat titik
8
dikunjungi sekali lagi, tapi tentu saja
nilainya tidak sama dengan nilai N
i = 9, A[9] = 27
Langkah - 4. N == 27
27
27 Ditemukan
// FiboPrg1
#include<stdio.h>
#include<conio.h>
void main()
{ int i, j, F0, F1, Fibo, n, m, N, Flag;
int FK, FK1, FK2, FK3, s, p, q, t;
int A[16] = { 0, 5, 7, 12, 15, 17,
19, 22, 25, 27, 32,
35, 37, 40, 45, 53 };
int FIBO[8];
clrscr();
n = 15;
F0 = 1; F1 = 1; Fibo = 1;
j = 1;
while(Fibo <= n+1)
{ FIBO[j] = Fibo;
Fibo = F0+F1; F0=F1; F1=Fibo;
j++; }
s = j - 1;
FK = FIBO[s];
FK1 = FIBO[s-1];
FK2 = FIBO[s-2];
FK3 = FIBO[s-3];
i = FK1;
p = FK2;
q = FK3;
m = (n+1) - FK;
printf("\n Inputkan sebuah nilai : " );
scanf("%d", &N);
if(N > A[i])
i = i + m;
Flag = 0;
while( i != 0 && Flag == 0)
{ if(N == A[i]) Flag = 1;
else
if(N < A[i])
{ if(q == 0) i = 0;
else { i = i - q;
t = p;
p = q; q = t - q;
}
}
else
{ if(p==1)
i = 0;
else
{ i = i + q;
p = p q; q = q - p;
}
}
}
if(Flag == 1)
printf("\nFOUND");
else printf("\nNOT FOUND" );
}
Menginput nilai
N Untuk pertama kali,
bila N > A[ i], maka i harus ditambah
dengan nilai m
Flag dibuat = 1
bila ditemui A[I]
=N
Kurangkan
nilai i
untuk
menelusuri
ke kiri
i dibuat = 0
agar keluar
dari loop, tanpa
menemukan nilai N
i dibuat =
0 agar
keluar
dari loop, tanpa
menemukan nilai
N
Tambahka
n nilai i
untuk
menelusuri
ke kanan
10
11
12
13
12
15
17
19
22
25
27
32
35
37
40
Untuk n = 20
1
FIBO[]
8 13 21
Fk-1
Fk-2
Fk-3
i
p
q
m
=
=
=
=
15
45
16
53
57
17
18
62
66
19
20
69
73
clrscr();
n = 15;
F0 = 1; F1 = 1; Fibo = 1;
j = 1;
while(Fibo <= n+1)
{ FIBO[j] = Fibo;
Fibo = F0+F1; F0=F1; F1=Fibo;
j++; }
s = j - 1;
Fk
m = n+1 Fk
= 21 21
= 0
14
13
8
5
0
FK
FK1
FK2
FK3
=
=
=
=
FIBO[s];
FIBO[s-1];
FIBO[s-2];
FIBO[s-3];
i = FK1;
p = FK2;
q = FK3;
m = (n+1) - FK;
Akar i=13
13
i=8
p=5
q=3
17
25
18
i=2
p=1
q=1
3
2
7
i=1
p=1
q=0
i=6
p=1
q=0
12
7
6
15
19
i=11
p=2
q=1
i=10
p=1
q=1
i=7
p=1
q=1
i=3
p=2
q=1
40
i=18
p=3
q=2
i=5
p=3
q=2
p=8
q=5
22 i=9
p=1
q=0
10
11
32
35
i=16
p=2
q=1
i=12 i=15
p=1
p=1
q=0
q=1
12
14
II
I
U
15
35
27
66
16
53
i=20
p=1
q=1
20
57
17
62
19
73
69
45
ntuk jumlah
elemen n = 30
Fk-2
q = 5
Fk-1
4
7
p = 8
10 11 12 13
14
15 16
17
18 19 20
10 12 17 19 25 27 29 31 34 35 39 42 44 45 48 49 52 55
Fk
q=8
m = 10
21
22
23
24
25
26
27
28
29
30
31
57 58 64 68 70 72 74 75 77 80
n
= 50
Fk = 34
Fk-1
= 13
i = 13
Fk-2
= 8
p = 8
Fk-3
= 5
q = 5
= (30 + 1)-21 = 10
m = 10
i=13
p=8
q=5
13
Bagian
ini
Sudah
Jelas
i=23
p=8
q=5
23
i=28
p=3
q=2
i=18
p=5
q=3
i=15
p=3
q=2
i=21
p=2
q=1
18
15
i=iq
p t==q p
q=t
q
i=13
p=2
i=20
p=1
q=1
i=17
p=1
q=1
q=1
i=14
p=1
q=1
13
14
q=0
p=1
16
q=0 p=1
i=22
p=1
q=0
i=19 20
p=1
q=0
17
q=0
i=25
p=1
q=1
22
p=1
19
p=1
p=1
q=0
25
p=1
q=0
388
3883
28
i=26
p=2
q=1
21
24
p=1
i = i +
q p = p
- q q =
q-p
i=30
p=1
30 q=1
26
29 i=29 p=1
27
q=0
p=1
q=0
q=0
p=1
12. 12
Contoh Soal -1
Dalam array yang dibuat dengan int A[51] kolom A[1] sampai dengan A[50] sudah
ada isinya nilai nilai numerik yang urut menaik dari nilai terkecil sampai dengan nilai
terbesar sebagai berikut :
0
1
2
4
21
39
5
7
24
25
10 11 12 13 14 15 16
17 18 19 20
10 12 17 19 25 27 29 31 34 35 39 42 44 45 48 49 52 55
22
40
23
26
27
28
29
30
31
32
33
34
35
36
37
38
42
43
44
49
45
50
46
47
48
Catatan : Indeks yang ditandai dengan panah,(yaitu : 1,2,3,5,8,13,21,34) adalah nilai-nilai deret
Fibonacci yang dipakai sebagai key.
Soal :
c. 17
i. 2
f. 89
q = 8
0
19
1
20
10
11
12
13
14
15
16
17
18
10 12 17 19 25 27 29 31 34 35 39 42 44 45 48 49 52 55
q=8
p = 13
21
40
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
41
42
43
44
49
45
50
46
47
48
389
3893
Fk
=
=
50
34
Fk-1 = 21
i = 21
Fk-2 = 13
p = 13
Fk-3 = 8
q= 8
m = (50 + 1) - 34 = 17
39
12. 13
Jawab :
50
Fk
34
Fk-1 =
21
i = 21
Fk-2 =
13
p = 13
Fk-3 = 8
(1)
(2)
(3)
q
(4)
q
q = 8
(5) i = i +
q (6) p =
p -q (7) q
=q-p
m = (50 + 1) - 34 = 17
a.
i=i-q
t=p
q <= 0 --> tidak ditemukan
p =
Untuk : N = 5
A[i] = 57
N = 5, ---> N Tidak Lebih besar dari A[i], sehingga i tidak dirobah.
q = 8
0
6
8
10 11 12 13 14 15 16
17 18 19 20
10 12 17 19 25 27 29 31 34 35 39 42 44 45 48 49 52 55
q=8
p = 13
21
39
22
40
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Langkah
ke-
A[i]
Kondisi
N & A[I]
Cari ke
Kondisi
kiri / kanan
Ke kiri
i
q
(1)
Kondisi
(2) (3)
(4)
8
13
8
13
8
5
5
3
II
I
13
21
8
13
5
8
39
57
5 < 39
5 < 57
ke kiri
Ke kiri
q != 0
q != 0
III
27
5 < 27
ke kiri
q != 0
IV
17
5 < 17
ke kiri
q != 0
10
5 < 10
ke kiri
q != 0
VI
5<7
ke kiri
q != 0
VII
5 = 5
i
(5)
Ke kanan
( 6)
(7)
390
3903
38