**插值搜尋法**（Interpolation search）是利用插值公式來計算猜測搜尋鍵值的位置。搜尋方式與二分搜尋相同。

插值公式：

插值 = (設算數 -­ 最小數) / (最大數 -­ 最小數)：

搜尋鍵值 = left + parseInt( ( key - data[left] ) / ( data[right] - data[left] ) )\*( right - left ) )

演算法
---

插值搜尋之演算法與二分搜尋演算法幾乎完全相同，差別在：

二分搜尋法：猜測鍵值在中間位置(middle)

插值搜尋法：用插值公式計算鍵值位置

### 時間複雜度

二分搜尋在一般的情況下時間複雜度是對數時間，進行O(\log n)次比較操作（n在此處是數組的元素數量，O是大O記號，\log 是對數）。

插值搜尋的最壞時間複雜度是O(n)，平均進行{\displaystyle O(\log(\log n))}次比較操作。因為用插值公式計算搜尋鍵值，能使搜尋範圍比二分法更快縮小。所以除非輸入數據數量很少，否則插值搜尋比二分搜尋與線性搜尋更快，但數組必須事先被排序。無論對任何大小的輸入數據，插值搜尋演算法使用的空間複雜度一樣是O(1)。

### 實作

JS code:

```
var interpolationSearch = function(data, key){
 var left = 0;
 var right = data.length - 1;
 var m = 0;
 while(left <= right){
 var m = parseInt((right - left)\*(key - data[left])/(data[right] - data[left])) + left;
 if( m < left || m > right)
 break;
 if(key < data[m])
 right = m - 1;
 else if(key > data[m])
 left = m + 1;
 else
 return m; 
 }
 return -1;
};

//執行
var data = getRandomData();
quickSort(data, 0, data.length-1);
interpolationSearch(data, 5); // (data, key)

```

### Julia (程式語言)

```
# Julia Sample : InterSearch
function InterSearch(A,key)
 left,right,m = 1, length(A), 1
 while(left<=right)
 m=floor(Int,((right-left)\*(key-A[left])/(A[right]-A[left])+left))
 
 if (m<left)||(m>right)
 break
 end

 if key<A[m]
 right=m-1
 elseif key>A[m]
 left=m+1
 else
 return m
 end

 end
 return -1
end

# Main Code
A = [1,3,16,31,43,354,586] # Already Arrange
println(A) # Original Array
println(InterSearch(A,43)) # Interpolation Search Array
println(InterSearch(A,354)) # Interpolation Search Array
println(InterSearch(A,3)) # Interpolation Search Array

```

参考资料
----

1. ↑  YehYeh..  [2019-06-11]. （原始内容存档于2020-04-27）.
2. ↑  {{插值排序}}
3. ↑  {{二分搜尋演算法}}
4. ↑  Andersson, Arne, and Christer Mattsson. ‘Dynamic Interpolation Search in *o*(log log *n*) Time’. In Automata, Languages and Programming, edited by Andrzej Lingas, Rolf Karlsson, and Svante Carlsson, 700:15–27. Lecture Notes in Computer Science. Springer Berlin / Heidelberg, 1993. doi:10.1007/3-540-56939-1\_58
5. ↑  YehYeh..  [2019-06-11]. （原始内容存档于2020-04-27）.

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |