PHP二分法查找,MYSQL索引即为用了此查找

来源:互联网 发布:linux命令进入e盘 编辑:程序博客网 时间:2024/06/06 00:54
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半,递归找,即可。时间复杂度:O(log2n)。
比如说我有排序好的数组$arr = [1,5,7,8,10,34,35,70,90],我想找里面的$key70
判断取所有值的长度,对半/2这里有9个数字/2这里是4.5,当然数组里也没有4.5的下标,我们可以强制转为intval这里得到的是4为基数
我们拿$arr[4]也就是这里的10再和$key70进行对比,发现10是比70小的,所以我们再把下标刚刚的4再加1再查找,这样的话,又缩小了一半的查询,但如果你想找的$key小于10,只要把4减1可以查找
PHP写法
/**
      * 二分查找
      * @param Array $arr 待查找的数组
      * @param Int $key 要查找的关键字
      * @return Int
      */
    function bin_search(Array $arr,$key)
    {
        $high = count($arr);
        if($high <= 0)
            return 0;
        $low = 0;
        while($low <= $high)
        {     
            //当前查找区间arr[low..high]非空
              $mid=intval(($low + $high) / 2);
            if($arr[$mid] == $key) 
                return $mid; //查找成功返回
            if($arr[$mid] > $key)
                $high = $mid - 1; //继续在arr[low..mid-1]中查找
            else
                $low = $mid + 1; //继续在arr[mid+1..high]中查找
        }
        return 0; //当low>high时表示查找区间为空,查找失败
    }
    $arr = array(1,2,4,6,10,40,50,80,100,110);
    echo bin_search($arr,80);