1
+ package Searches ;
2
+
3
+ /*
4
+ * Fibonacci Search is a popular algorithm which finds the position of a target value in
5
+ * a sorted array
6
+ *
7
+ * The time complexity for this search algorithm is O(log3(n))
8
+ * The space complexity for this search algorithm is O(1)
9
+ * @author Kanakalatha Vemuru (https://github.com/KanakalathaVemuru)
10
+ */
11
+ public class FibonacciSearch implements SearchAlgorithm {
12
+ /**
13
+ * @param array is a sorted array where the element has to be searched
14
+ * @param key is an element whose position has to be found
15
+ * @param <T> is any comparable type
16
+ * @return index of the element
17
+ */
18
+ @ Override
19
+ public <T extends Comparable <T >> int find (T [] array , T key ) {
20
+ int fibMinus1 = 1 ;
21
+ int fibMinus2 = 0 ;
22
+ int fibNumber = fibMinus1 + fibMinus2 ;
23
+ int n = array .length ;
24
+
25
+ while (fibNumber < n ) {
26
+ fibMinus2 = fibMinus1 ;
27
+ fibMinus1 = fibNumber ;
28
+ fibNumber = fibMinus2 + fibMinus1 ;
29
+ }
30
+
31
+ int offset = -1 ;
32
+
33
+ while (fibNumber > 1 ) {
34
+ int i = Math .min (offset + fibMinus2 , n - 1 );
35
+
36
+ if (array [i ].compareTo (key ) < 0 ) {
37
+ fibNumber = fibMinus1 ;
38
+ fibMinus1 = fibMinus2 ;
39
+ fibMinus2 = fibNumber - fibMinus1 ;
40
+ offset = i ;
41
+ }
42
+ else if (array [i ].compareTo (key ) > 0 ) {
43
+ fibNumber = fibMinus2 ;
44
+ fibMinus1 = fibMinus1 - fibMinus2 ;
45
+ fibMinus2 = fibNumber - fibMinus1 ;
46
+ }
47
+ else {
48
+ return i ;
49
+ }
50
+ }
51
+
52
+ if (fibMinus1 == 1 && array [offset + 1 ] == key ) {
53
+ return offset + 1 ;
54
+ }
55
+
56
+ return -1 ;
57
+ }
58
+
59
+ // Driver Program
60
+ public static void main (String [] args ) {
61
+ Integer [] integers = {1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 };
62
+
63
+ int size = integers .length ;
64
+ Integer shouldBeFound = 128 ;
65
+ FibonacciSearch fsearch = new FibonacciSearch ();
66
+ int atIndex = fsearch .find (integers , shouldBeFound );
67
+
68
+ System .out .println (
69
+ "Should be found: " + shouldBeFound + ". Found " + integers [atIndex ] + " at index " + atIndex +". An array length " + size );
70
+ }
71
+
72
+ }
0 commit comments