数据结构——插值查找

插值查找算法

一:插值查找介绍:

  1. 插值查找算法类似于二分查找法,但是不同的是二分查找法每次是从数组中间开始查找,但是插值查找每次从自适应mid处开始查找。
  2. 二分查找法获取mid是(left+right)/2,left表示数组最左边的下标值,right表示数组最右边的下标值。而插值查找算法获取mid是left + (right - left)*(value - array[left])/(array[right] - array[left]);需要注意的是插值查找算法有个前提是带查找的数组是有序,默认是数据从小到大排序。

二:举例说明插值查找算法

假设我们有一数组:array = [1,2,3,4,5,6…100]
现在我们要查找数据 1
使用二分查找法的话:mid会有多个值,才能找到
但是使用插值查找的话:根据公式
left + (right - left)*(value - array[left]) / (array[right] - array[left])=
0 + (99 - 0)*(1 - 1) / (100 - 0) = 0+0 = 0
所以mid的值为0,一次操作就找到了1的下标值效率会比二分查找法快很多

三:代码:

public class InsertSearch {
    public static void main(String[] args) {
        int[] array = new int[100];
        for (int i = 0; i < 100; i++) {
            array[i] = i+1;
        }
        array[98] = 100;
        array[34] = 34;
        array[35] = 34;

        List<Integer> list = insertValueSearchs(array, 0, array.length - 1, 34);
        System.out.println(list);
    }

  public static List<Integer> insertValueSearchs(int[] array,int left,int right,int value){
        if (left>right||value<array[0]||value>array[array.length-1]){
            return null;
        }

        int mid = left + (right-left)*(value-array[left])/(array[right]-array[left]);

        int midValue = array[mid];
        if (midValue>value){
            return insertValueSearchs(array,left,mid-1,value);
        }else if (midValue<value){
            return insertValueSearchs(array,mid+1,right,value);
        }else {
            List<Integer> list = new ArrayList<>();
            int temp = mid - 1;
            while (true){
                if (temp<0||array[temp]!=value){
                    break;
                }
                list.add(temp);
                temp--;
            }

            list.add(mid);

            temp = mid + 1;
            while (true){
                if (temp>array.length-1||array[temp]!=value){
                    break;
                }
                list.add(temp);
                temp++;
            }

            return list;
        }

    }
}
发布了26 篇原创文章 · 获赞 5 · 访问量 4166
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章