分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版

勺顛顛發表於2019-07-31

場景說明:
當要查詢大規模的資料時,不必順序查詢【就是整個資料集合全檢索】會影響效率,所以要進行分塊並構建自己的索引表,從索引表裡查詢到對應的範圍,再去查詢資料,它們的演算法效能介於折半查詢演算法【可看前面我擼過的二分查詢演算法】。
將查詢表進行分塊處理,每塊儲存起始地址和最大的關鍵字
檢索時先從索引表裡查詢可能存在的關鍵字從而確定查詢範圍 ,從而提升效能不必從一張很的查詢表裡查詢大量的資料。

<?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!");
    }

})();

相關文章