在哪种情况下,我们可以使用插值算法搜索来代替二进制搜索算法?

时间:2018-08-01 14:24:24

标签: php algorithm binary-search-tree interpolation

我有两个排序数组:

$idProducts = [2,9,25,666,1001,1002,1005,2546...n]; //almost 55.000 values
$someIds =    [1,9,11,12,99,111,855...n]; //almost 2.500 values

我尝试从idProducts和$ someIds的交集创建一个新数组。 我应用了3种搜索算法:线性,二进制,极间搜索,但是只有线性和二进制算法才能正常工作:

foreach($someIds as $id){
   if(interpolation_search($idProducts, $id) >=0){
        $newArray[]=$id;
   }
}
function interpolation_search($list, $x)
{
$l = 0;
$r = count($list) - 1;

while ($l <= $r) {
    if ($list[$l] == $list[$r]) {
        if ($list[$l] == $x) {
            return $l;
        } else {
            // not found
            return -1;
        }
    }

    $k = ($x - $list[$l])/($list[$r] - $list[$l]);

    // not found
    if ($k < 0 || $k > 1) {
        return -1;
    }

    $mid = round($l + $k*($r - $l));

    if ($x < $list[$mid]) {
        $r = $mid - 1;
    } else if ($x > $list[$mid]) {
        $l = $mid + 1;
    } else {
        // success!
        return $mid;
    }

    // not found
    return -1;
}

}

无论如何,最好的解决方案是:

$idProducts = array_flip($idProducts);
foreach ($someIds as $id){
   if (isset($idProducts [$id])===true){
            $newArray[]=$id;
   }
}

但是我想知道为什么插值在我的情况下不能正常工作,在这种情况下我们可以实现插值算法搜索。

谢谢。

0 个答案:

没有答案