算法-查找-插值查找

算法来源

    对于插值查找,就是对于二分查找的优化,将二分查找中的mid = (low + high) / 2改为mid = low + (high - low) * (key - a[low]) / (a[high] - a[low])。插值查找是根据查找关键子key与查找表中最大最小记录关键字比较后的查找方法,核心在于插值计算公式(key-a[low])/(a[high] - a[low])。

算法分析

    时间复杂度依旧为O(logn)。

    对于表长较大,而关键字分部比较均匀的查找表来说,平均性能要比折半好很多。

    如果数组中的分部类似{1,100,200,1000,10000...10000}这种极端不均匀的数据,用插值法也不太合适。

javaScript:

function search(arr, key, left, right){

    while(left < right){

        if(arr[left] == key){

            return left

        }

        if(arr[right] == key){

            return right

        }

        let middle = left + (right-left)*((key-arr[left])/(arr[right]-arr[left]))

        middle = Math.floor(middle)

        if(arr[middle] == key){

            return middle

        }

        if(key < arr[middle]){

            return search(arr, key, left, middle-1)

        } else {

            return search(arr, key, middle+1, right)

        }

    }

    return -1

}


let arr1 = [0, 9, 11, 39, 68, 88, 101]

console.log(search(arr1, 88, 0, arr1.length-1))

你可能感兴趣的:(算法-查找-插值查找)