CS3343/3341 Analysis of Algorithms Spring 2012 Weird Topic |
Binary, Ternary, and Fibonacci Searches |
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; } } } |