算法-插值查找


二分查找這個概念是非常簡單的一個算法,也就是我們俗稱的折半查找,原理是在一個有序的數組中,先取中間的值,如果中間值大於或者小於我們需要查找的值,那么就舍棄一般,在另一半中進行查找.

下面是一個簡單的二分查找:

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));
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM