查找算法之插值查找

插值查找相對於重複二分查找,則進行了複雜的四則運算,是二分查找法的優化。

<?php

/**
 * 插值查找
 * 
 * @param string $find 要查找的值
 * @param array $array 要查找的數組
 * @return bool|string
 */
function interpolationSearch ($find, array $array)
{ 
    // 數組開始下標
    $left = 0;

    // 獲取數組最後一個下標
    $right = count($array) - 1;

    // 獲取循環次數
    $num = 0;

    // 循環遍歷
    while ($array[$left] != $array[$right] && $find >= $array[$left] && $find <= $array[$right]) {

        $num++;
        
        $middle = intval($left + ($find - $array[$left]) * ($right - $left) / ($array[$right] - $array[$left]));

        if ($array[$middle] < $find) { 
            $left = $middle + 1;
        } elseif ($array[$middle] > $find) { 
            $right = $middle - 1;
        } else { 
            var_dump('遍歷了 ' . $num . ' 次');
            return $middle;
        }
    }
    
    var_dump('遍歷了 ' . $num . ' 次');

    // 未找到
    return false;
}

// 創建一個 1 到 100 的數組
$array = [1, 3, 3, 4, 4, 5, 5, 6, 7, 7, 9, 9, 9, 10, 11, 12, 13, 13];

// 要查找 9 第一次出現的位置
$find = '9';

// 將數組亂序
$result = interpolationSearch($find, $array);

var_dump($result);
發佈了190 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章