算法-插值查找

二分查找这个概念是非常简单的一个算法,也就是我们俗称的折半查找,原理是在一个有序的数组中,先取中间的值,如果中间值大于或者小于我们需要查找的值,那么就舍弃一般,在另一半中进行查找.

下面是一个简单的二分查找:

package com.hotusm.algorithm.insertvaluesearch;

import java.util.Arrays;

/**
 * @author Hotusm  <br/>
 * @date 2017年4月3日   <br/>
 * @description
 */
public class InsertValueSearch {

    
    public static boolean search(int[] arr,int key,int left,int right){
        while(left<right){
            // 二分
            int middle=(left+right)/2;
            if(arr[middle]==key){
                return true;
            }
            if(key<arr[middle]){
                right=middle-1;
            }else{
                left=middle+1;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        int[] arr=new int[]{2,3,45,1234};
        Arrays.sort(arr);
        System.out.println(search(arr, 45, 0, arr.length-1));
    }
    
}

 

这种方式的查找其实是将值构造成了一颗二叉排序数,然后进行查找.这种搜索的好处在于大大的缩短了搜索时间,时间复杂度为logn  小于线性的n

而插值查找则比较灵活,并不是简单的从中间进行的,它是根据我们需要查询的值的渐进进行搜索的.

插值查找的不同点在于每一次并不是从中间切分,而是根据离所求值的距离进行搜索的.

下面是算法:

package com.hotusm.algorithm.insertvaluesearch;

import java.util.Arrays;

/**
 * 插值查找
 * @author Hotusm  <br/>
 * @date 2017年4月3日   <br/>
 * @description
 */
public class InsertValueSearch {

    
    public static boolean search(int[] arr,int key,int left,int right){
        while(left<right){
            int middle=left+(right-left)*((key-arr[left])/(arr[right]-arr[left]));
            if(arr[middle]==key){
                return true;
            }
            if(key<arr[middle]){
                right=middle-1;
            }else{
                left=middle+1;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        int[] arr=new int[]{2,3,45,1234};
        Arrays.sort(arr);
        System.out.println(search(arr, 45, 0, arr.length-1));
    }
    
}

 

posted @ 2017-04-03 12:28  Hotsum  阅读(4590)  评论(0编辑  收藏  举报