插值查詢演算法
對於有序的數列[陣列]來說,查詢乙個具體的數值[陣列的value],可以使用順序查詢,也可以使用前一章節學習的折半[二分法]查詢。下面有乙個具體的例項:
$arr = [1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]這是乙個分布均勻的有序陣列,這次需要查詢陣列的值為1的鍵,或者是乙個值為20
的鍵。首先使用順序查詢:
順序查詢:當 findvalue = 1 只需要一次,當findvalue = 20 就需要差不多二十幾次才能找到,可以說是相當的不穩定
折半查詢:當 findvalue = 1 如圖:
折半查詢:當 findvalue = 20 如圖:
這裡可以看到折半查詢需要遞迴五次才能找到需要的數字,很費事很費力,那麼在這種分布均勻的陣列中查詢乙個數值有沒有乙個討喜的方法呢,答案是有的:
折半查詢的公式 $middle = $leftindex + ($rightindex - $leftindex) / 2
$middle 代表陣列的中間值的鍵, $leftindex 代表陣列的最小索引, $rightindex 代表陣列的最大索引
插值查詢的公式 $midlle = $leftindex + ($rightindex - $leftindex) * ($findvalue - $data[$leftindex]) / ($data[$rightindex] - $data[$leftindex])
$findvalue 代表需要查詢的值,$data代表的是有序的陣列,$midlle,$leftindex,$rightindex和上面代表的意思一樣
下面是具體的**實現:測試發現,對於分布均勻的陣列中,查詢某乙個數值,幾乎就是一次就可以找到,很神奇吧.最大的功臣就屬於上面的那個公式了。
* notes:
* file name:$
* create by: jay.li
* created on: 2019/12/13 0013 11:40
class searchvalue
protected static $num = 0;
public function findvalue1(array $data, int $leftindex, int $rightindex, int $findvalue)
var_dump("迴圈次數:" . ++self::$num);
if (!is_array($data)) elseif ($findvalue > $middlevalue) else {
return $middlevalue;
$obj = new searchvalue();
$data = [1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var_dump($obj->findvalue1($data, 0, count($data) - 1, 20));
liyi ---- github位址
插值查詢 插值搜尋
這是一種和二分比較相似的查詢的演算法,不過不同的是,對於分布比較均勻的較大的陣列,插值查詢有時能夠一次就搜尋到位.為什麼能夠這麼快呢 看網上沒有什麼關於這種演算法的描述,我就來描述一下吧.首先要知道一點,這種搜尋方式只能夠針對順序表進行,再乙個要理解順序表中的乙個特點,在順序表中查詢是否存在乙個值,...
查詢 插值查詢
插值查詢 插值查詢法的演算法思想 插值查詢法其實就是折半查詢法的加強優化版,它對mid的演算法進行了重新的規定,使此查詢法的效率更高。mid low high low key a low a high a low 插值查詢法的演算法可描述如下 int search keytype key,int n...
查詢 插值查詢
問題描述 通過插值查詢,查詢乙個數在給定陣列中是否存在,若存在找到位置索引,不存在返回 1 給定陣列中的數值都不相等 演算法實現 privat int interpolationsearch int arr,int lo,int hi,int key int mid lo hi lo key arr...