場景說明:
當要查詢大規模的資料時,不必順序查詢【就是整個資料集合全檢索】會影響效率,所以要進行分塊並構建自己的索引表,從索引表裡查詢到對應的範圍,再去查詢資料,它們的演算法效能介於折半查詢演算法【可看前面我擼過的二分查詢演算法】。
將查詢表進行分塊處理,每塊儲存起始地址和最大的關鍵字
檢索時先從索引表裡查詢可能存在的關鍵字從而確定查詢範圍 ,從而提升效能不必從一張很的查詢表裡查詢大量的資料。
<?php
/**
* Created by PhpStorm.
* User: 1655664358@qq.com
* Date: 2019/5/2
* Time: 11:22
*/
class Index{
public $key;//索引塊表中的最大值
public $start;//索引塊表中的起始地址
}
function cmp(Index $a,Index $b)
{
if ($a->key==$b->start){
return 0;
}
return $a->key>$b->key?1:-1;
}
/**
從索引表中檢索,再從資料集合裡檢索資料
**/
function search($key,$data=[],$index=[]):int
{
$i=0;
while($i<3&&$key>$index[$i]->key){//索引表中檢索獲取某塊
$i++;
}
if ($i>=3){
return -1;
}
$startValue = $index[$i]->start;//獲取某塊起始地址
while($startValue<=$startValue+5&&$data[$startValue]!=$key){//從查詢表指定範圍檢索
$startValue++;
}
if ($startValue>$startValue+5){
return -1;
}
return $startValue;
}
(function(){
//查詢表【資料集合】
$data = [54,53,52,51,50,55, 44,46,48,49,43,41, 84,83,65,74,98,100];
//索引塊表
$index = [];
$j=-1;
$indexObj = new Index();
for($i=0;$i<3;$i++){//資料分塊處理
$obj = clone $indexObj;
$obj->start=$j+1;
$j+=6;
$index[$i] = $obj;
for ($k=$index[$i]->start;$k<=$j;$k++)
{
if ($index[$i]->key<$data[$k]){
$index[$i]->key = $data[$k];
}
}
}
usort($index,'cmp');
$key = fgets(STDIN,10);
$location = search(intval($key),$data,$index);
if ($location>=0){
fwrite(STDOUT,"ok find elem ".$location);
}else{
fwrite(STDERR,"not found!");
}
})();