數據結構——插值查找

插值查找算法

一:插值查找介紹:

  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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章