费氏查找(求高人讲解)

java实现

package sort;

public class FibonacciSearch {
    public static int search(int[] number, int des) {
        int[] fib = createFibonacci(number.length); 

        int x  = findX(fib, number.length+1, des);

        int m = number.length - fib[x]; 

        x--;
        int i = x; 

        if(number[i] < des)
            i += m; 

        while(fib[x] > 0) {
            if(number[i] < des)
                i += fib[--x];
            else if(number[i] > des)
                i -= fib[--x];
            else
                return i;
        } 

        return -1; 

    }

    private static int[] createFibonacci(int max) {
        int[] fib = new int[max];
        for(int i = 0; i < fib.length; i++) {
            fib[i] = Integer.MIN_VALUE;
        }

        fib[0] = 0;
        fib[1] = 1; 

        for(int i = 2; i < max; i++)
            fib[i] = fib[i-1] + fib[i-2];

        return fib;
    }

    private static int findX(int[] fib, int n, int des) {
        int i = 0; 

        while(fib[i] <= n)
            i++; 

        i--; 

        return i;
    }

    public static void main(String[] args) {
        int[] number = {1, 4, 2, 6, 7, 3, 9, 8};

        QuickSort.quickSort(number);

        int find = FibonacciSearch.search(number, 3);

        if(find != -1)
            System.out.println("找到數值於索引 " + find);
        else
            System.out.println("找不到數值");
    }

}
时间: 2024-10-12 20:42:20

费氏查找(求高人讲解)的相关文章

一位高人讲解的算命

一位高人讲解的算命,厚德载物,自强不息,惊呆了上亿人 (新朋友 请点击标题下面"演讲与口才"快速关注我们,学习更多顶尖与老师单独交流请加老师个人微信号189 6400 4971) 先说风水 中国人都知道风水,也很认真的去了解.运用风水. 风水的真相就是一句很老的话福地福人居. 你要是有福分,住在风水差的地方,风水会随你转好. 你要是没福分,住在风水好的地方,你镇不住,好风水会自行破掉. 这里有个故事,说禅宗一个祖师,看中一处风水,建庙宇的话,将来可以有很多人才在这里修行成就.庙宇修好了

经典算法详解(2):费氏数列

说明: Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只免子每个月生一只小免子,一个月后小免子也开始生产.起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)....... 如果不太理解这个例子的话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生产,类似的道理也可以用于植物的生长,这就是Fibonacci数列,一般习惯称之为费氏数列,例如以下: 1.1 .2.3.5.8.13.21.34.55.89...... 分

C++ 二分查找 求最近的值

上代码: <span style="font-size:18px;"> #include <iostream> #include <math.h> using namespace std; int BinarySearch(float *array, int aSize, float key) { if ( array == NULL || aSize == 0 ) return -1; int low = 0; int high = aSize -

二分查找、三分查找求极点、二分求等比数列【模板】

二分查找: int a[110],N; int BinarySearch(int *a,int x) { int Left = a[1]; int Right = a[N]; while(Left <= Right) { int mid = (Left+Right)>>1; if(a[mid] == x) return mid; else if(a[mid] > x) Right = mid - 1; else Left = mid + 1; } return -1; } 三分查找

hdu 4405 Aeroplane chess(概率DP 求期望__附求期望讲解方法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405 Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal p

YT14-HDU-三分查找求F(x)的最小值

Problem Description Now, here is a fuction: F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) Can you find the minimum value when x is between 0 and 100. Input The first line of the input contains an integer T(1<=T<=100) which means the numb

二分查找---求开方

求开方 69. Sqrt(x) (Easy) Input: 4 Output: 2 Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part 题目描述: ??给定一个整数,求该整数的开方数. 思路分析: ??一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt.

费氏搜寻法

由于作者不习惯该编辑器,只是贴出上本文的截图,详见:https://www.yuque.com/docs/share/460edf3a-0128-4318-a86a-29f82c468e11 原文地址:http://blog.51cto.com/4754569/2324911

从零基础学三分查找

转载请注明:http://www.cnblogs.com/ECJTUACM-873284962/ 今晚是我们学长第二次讲课,讲了一个三分!认真听了一下,感觉不是很难,可能会比二分还简单些!我就把上课讲的内容归纳为一篇文章概述吧!以后也会重点讲解的! 简单点说二分是查找区间,相当于一次函数,三分就是二次函数了,求它的极值,怎么做,数学常用的是求导,计算机就用查找咯,那么请看下面的简单概述吧! 一. 概念 在二分查找的基础上,在右区间(或左区间)再进行一次二分,这样的查找算法称为三分查找,也就是三分