zoukankan      html  css  js  c++  java
  • 算法-插值查找

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

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

    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));
        }
        
    }
  • 相关阅读:
    DP问题之最长非降子序列
    CentOS 6.8 编译安装MySQL5.5.32
    [Linux] killall 、kill 、pkill 命令详解
    编写登陆接口
    python学习day01
    python购物车程序
    ERROR:Attempting to call cordova.exec() before 'deviceready'
    BSF脚本引擎‘改变’Bean
    Solr安装配置
    amchart配置备忘
  • 原文地址:https://www.cnblogs.com/zr520/p/6661677.html
Copyright © 2011-2022 走看看