二分查找的定义

原理

  • 二分查找也成为折半查找,是一种高效率的查找方法。
  • 折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

步骤

  • 确定要查找的区间
  • 确定要二分的参照点
  • 区间内选取二分点
  • 根据二分点的值,综合左右间情况以及求见的目的,舍去一般无用的区间
  • 继续在有效区间重复上面的步骤

PHP实现

function binary_search($arr, $number)
{
    if (!is_empty($arr) || empty($arr)) {
        return -1;
    }
    // 初始变量值
    $len = count($arr);
    $lower = 0;
    $high = $len - 1;

    // 最低点比最高点大就退出
    while ($lower <= $high) {

        // 以中间点作为参照点比较
        $middle = intval(($lower + $high) / 2);
        if ($arr[$middle] > $number) {
            // 查找数比参照点小,舍去右边
            $high = $middle - 1;
        } elseif ($arr[$middle] < $number) {
            // 查找树比参照点大,舍去左边
            $lower = $middle + 1;
        } else {
            return $middle;
        }
    }

    return -1;
}

/**
* @param array $arr
* @param int $number
* @param int $lower
* @param int $hith
*/
function binary_search_recursion(&$arr, $number, $lower, $high)
{
    $middle = intval(($lower + $high) / 2);

    if ($lower > $high) {
        return -1;
    }

    if ($number > $arr[$middle]) {
        return __FUNCTION__($arr, $number, $middle, $high);
    } elseif ($number < $arr[$middle]) {
        return __FUNCTION__($arr, $number, $lower, $middle - 1);
    } else {
        return $middle;
    }
}

时间复杂度

  • 有序数组中如果使用暴力的算法去查找,也就是逐个遍历比较,那么时间复杂度是O(n)
  • 但是,用二分查找后,因为每次可以舍去一半查找区间,所以会将时间复杂度减少到O(logn),算法更优。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!