数据结构与算法学习之路10--二分查找(上)

216 阅读1分钟

原理

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

复杂度分析

被查找的区间的的大小变化为nn/2n/4.....n/2^k,其中n/2^k=1,所以,经过了 k 次区间缩小操作,时间复杂度就是O(k)。通过n/2^k=1,我们可以求得k=log2n,所以时间复杂度就是 O(logn)。

代码实现php版

非递归实现

function bearch($arr, $value)
{
    $low = 0;
    $height = count($arr)-1;

    while ($low <= $height) {
        $middle =  (int)(($low + $height)/2);
        if ($arr[$middle] == $value) {
            return $middle;
        } elseif ($arr[$middle] > $value) {
            $height = $middle+1;
        } else {
            $low = $middle-1;
        }
    }
    return false;
}

递归实现

function bearch($arr, $low, $height, $value)
{
    if ($low > $height) {
        return false;
    }
    $middle =  (int)(($low + $height)/2);
    if ($arr[$middle] == $value) {
            return $middle;
        } elseif ($arr[$middle] > $value) {
            return bearch($arr, $low, $middle+1, $value);
        } else {
            return bearch($arr, $middle-1, $height, $value);
        }
}

二分查找的使用条件(局限性)

  • 二分查找需要使用下标来访问随机数据所以二分查找依赖数组
  • 二分查找依赖有序数据,因此只能用在插入、删除操作不频繁,一次排序多次查找的场景中。
  • 数据量太小不适合二分查找。
  • 数据量太大也不适合二分查找,因为依赖数组所以需要连续的内存,不利于零散内存的使用。