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; } } } |