【Day32】[演算法]-内插搜寻法Interpolation Search

内插搜寻法(Interpolation Search  ),又称插补搜寻法,是二分搜寻法的改良版,二分搜寻法是先找出中间值,而内插搜寻法是透过斜率公式来估出资料可能存在的位置,搜寻前也必须先将资料列排序好。

公式如下

https://ithelp.ithome.com.tw/upload/images/20211013/20121027gqrEoCTvTW.jpg


下面利用10 20 30 40 50 60 70 80 90搜寻40为例。
https://ithelp.ithome.com.tw/upload/images/20211013/20121027CvgzhXuanp.jpg


JavaScript

let data = [10,20,30,40,50,60,70,80,90];
let target = 40;

function interpolationSearch(arr, target) {
  let start = 0;
  let end = arr.length - 1;
  let mid;

  while (end >= start) {
    mid = Math.floor((target - arr[start]) * (end - start) / (arr[end] - arr[start]) + start);

    if (arr[mid] === target) {
      return "有搜寻结果: 在第" + (mid + 1) + "项";
    } else {
      if (target > arr[mid]) {
        start = mid + 1;
      } else {
        end = mid - 1;
      }
    }
  }
  return "无搜寻结果";
}

console.log(interpolationSearch(data, target)); //"有搜寻结果: 在第4项"

Python

#Interpolation Search

data = [10,20,30,40,50,60,70,80,90]
target = 40
def interpolationSearch(arr, target):
 
    start = 0
    end = len(arr)-1
 
    while start <= end:
        mid = (target - arr[start]) * (end - start) // (arr[end] - arr[start]) + start

        if target == arr[mid]:
            return "有搜寻结果: 在第" + str(mid+1) + "项"
        else:
            if target < arr[mid]:
                end = mid - 1
            else:
                start = mid + 1
    return "无搜寻结果"

print(interpolationSearch(data,target))#有搜寻结果: 在第4项

<<:  [Day28] Security

>>:  【没钱买ps,PyQt自己写】Day 28 - final project - 1 / 来搞一个自己的 photoshop 吧!UI 篇 + 纯程序架构篇 (结合 PyQt + OpenCV)

【踩坑】animation 选单按钮动起来(复习篇)

某天闲晃网站时看到一个充满魔性的选单按钮 是这个样子的 图源:https://www.pintere...

[Day03] swift & kotlin 入门篇!(1) 基础语法-变数与常数宣告

章节说明 在开始写APP之前 我们需要先对 Swift&Kotlin 的语法有基本上的认知 先练会使...

3.MYSQL建立自己的资料库

首先进入到MYSQL里面 输入自己前面设定的密码 进入之後建立一个新的资料库 按照下图的选项选择,然...

Day 16 Flask 前端

本来前端应该要更早点讲的,不过 Flask 的前端有了传入的值的话,可以有更多的操作,所以就放到这边...

运算与表达

算数运算符 + - * / % // 以上都是常用的算术运算符 举个例子 python = 5 c ...