查找AVL树散列表

Posted siyyawu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找AVL树散列表相关的知识,希望对你有一定的参考价值。

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

二分查找: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树散列表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构代码索引

C++_AVL树插入,查找与修改的实现(Key_Value+平衡因子+三叉链)

树--07---二叉树--04--平衡二叉树(AVL树)

手把手教你实现一个完整的BST(超级详细)

树:AVL树

平衡二叉查找树AVL