- 斐波那契也称黄金分割法,通过黄金分割点找到mid值,即mid=low+F(k-1)-1(F代表斐波那契数列)

| 由斐波那契数列 F[k]=F[k-1]+F[k-2] 的性质,可以得到 (F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1 。 |
| 该式说明:只要顺序表的长度为F[k]-1,则可以将该表分成长度为F[k-1]-1和F[k-2]-1的两段,即如上图所示。从而中间位置为mid=low+F(k-1)-1 |
| |
| 类似的,每一子段也可以用相同的方式分割 |
| |
| 但顺序表长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1。这里的k值只要能使得F[k]-1恰好大于或等于n即可, |
| 由以下代码得到,顺序表长度增加后,新增的位置(从n+1到F[k]-1位置),都赋为n位置的值即可 |

| 对一个有序数组进行斐波那契查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数" |
| public class FibonacciSearch { |
| |
| public static int maxSize = 20; |
| public static void main(String[] args) { |
| int [] arr = {1,8, 10, 89, 1000, 1234}; |
| System.out.println("index=" + fibSearch(arr, 189)); |
| } |
| |
| |
| |
| public static int[] fib() { |
| int[] f = new int[maxSize]; |
| f[0] = 1; |
| f[1] = 1; |
| for (int i = 2; i < maxSize; i++) { |
| f[i] = f[i - 1] + f[i - 2]; |
| } |
| return f; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static int fibSearch(int[] a, int key) { |
| int low = 0; |
| int high = a.length - 1; |
| int k = 0; |
| int mid = 0; |
| int f[] = fib(); |
| |
| while(high > f[k] - 1) { |
| k++; |
| } |
| |
| |
| int[] temp = Arrays.copyOf(a, f[k]); |
| |
| |
| |
| for(int i = high + 1; i < temp.length; i++) { |
| temp[i] = a[high]; |
| } |
| |
| while (low <= high) { |
| mid = low + f[k - 1] - 1; |
| if(key < temp[mid]) { |
| high = mid - 1; |
| |
| |
| |
| |
| |
| |
| |
| k--; |
| } else if ( key > temp[mid]) { |
| low = mid + 1; |
| |
| |
| |
| |
| |
| |
| |
| k -= 2; |
| } else { |
| |
| if(mid <= high) { |
| return mid; |
| } else { |
| return high; |
| } |
| } |
| } |
| return -1; |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)