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));
        }
        
    }
  • 相关阅读:
    使用 cordova-plugin-wechat 分享返回后闪退解决方法
    恢复删除的表
    移动端还原设计图
    js文本差异比较
    windows使用nvm安装nodejs后升级npm报错
    windows添加右键菜单"在此处打开cmd窗口"
    cordova热更新
    js变量提升
    c# 判断字符串是否是日期格式需要注意的一点小问题
    剑指offer_和为S的两个数字
  • 原文地址:https://www.cnblogs.com/zr520/p/6661677.html
Copyright © 2011-2022 走看看