CS3343/3341 Analysis of Algorithms Spring 2012 Weird Topic |
Fibonacci Search
|

0 < 55 | -- one range of size 55 0 < 34 < 55 | -- two: 34, 21 0 < 21 < 34 < 47 < 55 | -- four: 21, 13, 13, 8 0 < 13 < 21 < 29 < 34 < 42 < 47 < 52 < 55 | -- eight: 13,8,8,5,8,5,5,3 0< 8<13<18<21<26<29<32<34<39<42<45<47<50<52<54<55 | -- sixteen: 8,5,5,3,5,3,3,2,5,3,3,2,3,2,2,1 |
Let y = A[x]. Want to find x. N = 55. mid:34, p:21,q:13 | 0 < 34 < 55, y > A[34], so 0 < x < 34 mid:21, p:13,q: 8 | 0 < 21 < 34, y > A[34], so 21 < x < 34 mid:29, p: 5,q: 3 | 21 < 29 < 34, y > A[29], so 29 < x < 34 mid:32, p: 2,q: 1 | 29 < 32 < 34, y < A[32], so 29 < x < 32 mid:31, p: 1,q: 1 | 29 < 31 < 32, y < A[31], so 29 < x < 31 mid:30, p: 1,q: 0 | 29 < 30 < 31, y == A[30], x == 30 Found: 30 |
| Fibonacci Algorithm |
|---|
// Fibonacci search, search A[1],A[2],...,A[N]
// Here N+1 must be a Fibonacci number, F[m+1]
int fibSearch(int y) { // y = A[x], 0 < x < F[m+1]
int mid = F[m]; // F[m] is partway from 0 to F[m+1]
int p = F[m-1] = F[m] - F[m-1]
int q = F[m-2] = 2*F[m-1} - F[m]
for (;;) {
System.out.println("mid:" + mid + ", p:" + p + ",q:" + q);
if (y == A[mid) return mid;
else if (y < A[mid) {
if (q == 0) return -(mid - 1);
mid = mid - q;
int temp = p;
p = q;
q = temp - q;
}
else if (y > A[mid]) {
if (p == 1) return -mid;
mid = mid + q;
p = p - q;
q = q - p;
}
}
}
|