補間ルックアップ
次に、最後の検索方法を見つけました。いくつかの数字を検索すると、バイナリ検索が面倒になります。簡単な例として、1、2、3、4、5、6、7があり、1を検索すると、次のことがわかります。 3回検索しますが、少し不十分ですが、より効率的な方法はありますか?
原理
1.補間探索アルゴリズムは二分探索に似ていますが、違いは、補間探索が毎回適応中間から開始されることです。
2.ハーフサーチで中指を見つける式、低は左の人差し指、高は右の人差し指を表します。
キーは検索したい値ですfindValue
3.int midlIndex = low +(high-low)*(key --arr [| ow])/(arr [high] --arr [| ow])
対応するコードは次のようになります
int mid = left + (right - left) * (findValue-arr[left])/(arr[right] - arr[left])
例とアイデア
1〜100の配列で検索
アイデア
従来の方法では、 mid = 99/2 = 49であり、これは検索を開始する50番目の数値です。
しかし、1の場合、値を見つける必要があります。
二分探索を使用して、数1を見つけるために複数回繰り返す必要があります
補間検索アルゴリズムを使用している場合、mid = 0
検索が100の場合、mid = 0 + 99 * 99/99 = 99
コード
//插值查找
//@author 王
//2021年1月19日21:14:32
public class InsertValueSearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i+1;
}
int index = insertValueSearch(arr, 0, arr.length-1,3);
System.out.println(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("统计查找次数");
if(left > right || findValue < arr[0] || findValue > arr[arr.length-1]){
return -1;
}
//求出mid
int mid = left + (right - left) * (findValue - arr[left])/(arr[right] - arr[left]);
int midValue = arr[mid];
if(findValue > midValue){
//向右边递归
return insertValueSearch(arr, mid+1, right, findValue);
}else if(findValue < midValue){
//向左边查找
return insertValueSearch(arr, left, mid - 1, findValue);
}else{
return mid;
}
}
}
予防
1.参照テーブル大容量とのデータおよび比較的均一なキーワード分布は、補間検索が高速です。
2.の場合不均一なキーワード分布、このアクセス方法は必ずしもよい半分検索以上、時にはより最適化されています
以前のブログで書いたアルゴリズムの配列と検索方法を比較することができ、理解するでしょう