码迷,mamicode.com
首页 > 其他好文 > 详细

查找、AVL树、散列表

时间:2018-12-26 00:32:21      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:ret   avl   code   sea   长度   技术   ==   array   str   

插值查找是二分查找的改进,斐波那契查找是插值查找的改进。

二分查找:mid=(low+high)/  2

插值查找:mid=(key-a[low])*(high-low)/  (a[high]-a[low])

斐波那契查找主要思想是只要长度符合斐波那契数列,则该段数字可以用两个子段来分割,F(k)-1=(F[k-1]-1)+(F[k-2]-1),即mid=low+F(k-1)-1

技术分享图片

 

FibonacciSearch查找的实现:

package Fibonacci_Search;

//fibonacci数列查找
public class FibonacciSearch {


    //fibonacci数列
    public static int fib(int n)
    {
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        return fib(n-1)+fib(n-2);
    }



    //查找
    public static int fibonacci_search(int[] arr,int n,int key)
    {
        int low=1;  //记录从1开始
        int high=n;     //high不用等于fib(k)-1,效果相同
        int mid;

        int k=0;
        while(n>fib(k)-1)    //获取k值
            k++;
        int[] temp = new int[fib(k)];   //因为无法直接对原数组arr[]增加长度,所以定义一个新的数组
        System.arraycopy(arr, 0, temp, 0, arr.length); //采用System.arraycopy()进行数组间的赋值
        for(int i=n+1;i<=fib(k)-1;i++)    //对数组中新增的位置进行赋值
            temp[i]=temp[n]; 

        while(low<=high) {
            mid=low+fib(k-1)-1;
            if(temp[mid]>key) {
                high=mid-1;
                k=k-1;  //对应上图中的左段,长度F[k-1]-1
            }else if(temp[mid]<key) {
                low=mid+1;
                k=k-2;  //对应上图中的右端,长度F[k-2]-1
            }else {
                if(mid<=n)
                    return mid;
                else
                    return n;       //当mid位于新增的数组中时,返回n    
            }                          
        }
        return 0;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = {0,1,16,24,35,47,59,62,73,88,99};
        int n=10;
        int key=59;
        System.out.println(fibonacci_search(arr, n, key));  //输出结果为:6
    }

}

测试结果:6

查找、AVL树、散列表

标签:ret   avl   code   sea   长度   技术   ==   array   str   

原文地址:https://www.cnblogs.com/siyyawu/p/10177054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!