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) 稳定
  • 相关阅读:
    783. Minimum Distance Between BST Nodes
    290. Word Pattern
    155. Min Stack
    HDU 6069 Counting Divisors (素数+筛法)
    BZOJ 2038 小Z的袜子(hose) (莫队算法)
    HDU 6127 Hard challenge (极角扫描)
    HDU 6096 String (AC自动机)
    LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    ZOJ 3201 Tree of Tree (树形DP)
  • 原文地址:https://www.cnblogs.com/meichao/p/9226478.html
Copyright © 2011-2022 走看看