• (十八)查找算法——插值查找


    1. 插值查找原理介绍:
      插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。

    2. 将折半查找中的求 mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right.key 就是前面我们讲的 findVal

    3. int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/
      对应前面的代码公式:
      int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

    4. 法 举例说明插值查找算法 1-100 的数组

    1.插值查找应用案例:

    请对一个有序数组进行插值查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

    • 代码实现
    /**
     * 插值查找
     */
    public class InsertValueSearch {
    
        public static void main(String[] args) {
    
            //int[] arr = {1, 8, 10, 89, 1000, 1234};
            int[] arr = {1, 2, 3, 4, 5, 6};
            int index = insertValueSearch(arr, 0, arr.length - 1, 3);
            System.out.println("index:" + index);
        }
    
        /**
         * 插值查找
         *
         * @param arr
         * @param left
         * @param right
         * @param findValue
         * @return
         */
        public static int insertValueSearch(int[] arr, int left, int right, int findValue) {
            System.out.println("search");
            if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {
                return -1;
            }
            //公式
            int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
            if (findValue > arr[mid]) {
                //向右边找
                return insertValueSearch(arr, mid + 1, right, findValue);
            } else if (findValue < arr[mid]) {
                //向左边找
                return insertValueSearch(arr, left, mid - 1, findValue);
            } else {
                return mid;
            }
        }
    }
    

    2.插值查找注意事项:

    1. 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
    2. 关键字分布不均匀的情况下,该方法不一定比折半查找要好
  • 相关阅读:
    Erlang顺序型编程
    [转]理解gen_server behaviour
    [转]Parsing Text and Binary Files With Erlang
    [转]Running Hadoop On Ubuntu Linux (SingleNode Cluster)
    [转]erlang 监督树
    [转]Erlang之IO编程
    [转]分段表
    [转]如何“打败”CAP定理
    [转]A Millionuser Comet Application with Mochiweb
    [转]消息队列软件大比拼
  • 原文地址:https://www.cnblogs.com/everyingo/p/15009568.html
Copyright © 2020-2023  润新知