zoukankan      html  css  js  c++  java
  • 二分查找法

    工作原理

    一、流程图

    二、原理

    第一步:我们选取目标数和基准值

    $arr = [1,2,3,4,5,6,7,8,9];
    $mind = ceil(($start+$end)/2);
    

    第二步:判断当前要查找的值是否是基准值,是就直接返回下标;不是在判断是不是基准值的左边或右边,如果不存在,数组继续选取,直到找到为止返回下标。

    图解

    注意:

    1、二分查找法一定是排好序的,才能使用二分查找;

    源代码

    一、递归的方式实现

    <?php
        function search($arr, $key, $start, $end)
        {
            if($start > $end) return false;
            $mid = intval(ceil(($start + $end) / 2));
            if($arr[$mid] < $key){
                return search($arr, $key, $mid + 1, $end);
            }elseif($arr[$mid] > $key){
                return search($arr, $key, 0, $mid - 1);
            }else{
                return true;
            }
        }
    
        function find ($target, $array)
        {
            foreach ($array as $key => $value) {
                $len = count($value) - 1;
                $res = search($value, $target, 0, $len);
                if(!$res){
                    continue;
                }else{
                    return true;
                }
            }
            return false;
        }
    
        $arr = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]];
        find(5, $arr);

    二、迭代的方式实现

    function binSearch($arr, $key){  
        $start=0;  
        $end=count($arr)-1;  
        while($start <= $end){  
            $mid = ceil(($start+$end)/2);  
            if($arr[$mid] < $key){  
                $start = $mid+1;  
            }else if($arr[$mid] > $key){  
                $end = $mid-1;  
            }else{  
                return $mid;  
            }  
        }  
    }
    $arr = [1,2,3,4,5,6,7,8,9];
    $len = count($arr) - 1;
    $data = binSearch($arr, 5, 0, $len);
    var_dump($data);
    

    性能分析

    查找算法 时间复杂度 空间复杂度 稳定性
    平均情况 最坏情况 最好情况
    二分查找法 O(log2n) O(n) O(log2n) O(1)-O(log2n) 稳定
  • 相关阅读:
    Python 爬虫入门(一)
    Dubbo、Zookeeper集群搭建及Rose使用心得(二)
    Dubbo、Zookeeper集群搭建及Rose使用心得(一)
    JAVA 加密算法初探DES&AES
    Android 蓝牙模块基础操作
    IntelliJ IDEA 使用随笔
    Maven+SSM框架实现简单的增删改查
    记录一次bug解决过程:数据迁移
    SSM框架+Plupload实现断点续传(Spring+SpringMVC+MyBatis+Plupload)
    JAVA开发环境
  • 原文地址:https://www.cnblogs.com/meichao/p/9226478.html
Copyright © 2011-2022 走看看