CS3343/3341
 Analysis of Algorithms 
Spring 2012
Weird Topic
     
  Binary, Ternary, and Fibonacci   
Searches


Fibonacci Numbers

The Fibonacci Numbers consist of the sequence of integers: F0 = 0, F1 = 1, F2 = 1, F3 = 2, F4 = 3, F5 = 5, F6 = 8, F7 = 13, F8 = 21, F9 = 34, F10 = 55, ... . These are defined recursively by the following formula:


Binary, Ternary, and Fibonacci Searches. In Java, compared with one another.

Binary, Ternary, Fibonacci Search





public int binarySearch(double[] A, double y) {
   int low = 1;
   int high = A.length - 1;
   while (low <= high) {
      int mid = (low + high)/2;
      if (A[mid] == y) return mid; // found
      else if (A[mid] < y) low = mid + 1;
      else high = mid - 1;
   }
   return -1; // not found
}





public int ternarySearch(double[] A, double y) {
   int low = 1;
   int high = A.length - 1;
   while (low <= high) {
      int mid = (2*low + high)/3;
      if (A[mid] == y) return mid; //found
      else if (A[mid] > y) high = mid - 1;
      else {
         low = mid + 1;
         mid = (low + high)/2;
         if (A[mid] == y) return mid;// found
         else if (A[mid] > y) high = mid -1;
         else low = mid + 1;
      }
   }
   return -1; // not found
}

// Fibonacci search, search A[1],...,A[N]
// Here N+1 must be a Fib. number, F[m+1]
int N = F[m+1] - 1; // Fibonacci number - 1
int Np = F[m];  // previous Fibonacci number
public int fibonacciSearch(double[] A, double y) {
   int mid = Np;           //   F[m]
   int p   = (N+1) - Np;   //   F[m-1]
   int q   = 2*Np - (N+1); //   F[m-2]
   for (;;) {
      if (y == A[mid]) return mid; // found
      else if (y < A[mid]) {
         if (q == 0) return -(mid - 1);// not
         mid = mid - q;
         int temp = p;
         p = q;
         q = temp - q;
      }
      else if (y > A[mid]) {
         if (p == 1) return -mid;// not found
         mid = mid + q;
         p = p - q;
         q = q - p;
      }
   }
}