美文网首页
记录曾遇到的一个二分查找问题

记录曾遇到的一个二分查找问题

作者: 拿破仑蛋糕 | 来源:发表于2018-11-08 15:48 被阅读0次

    题目描述:
    给定一个 可重复有序数列 Array,判断一个数S是否在数列中,如果在,找出第一个符合条件的数的下标。

    当时,由于之前没有研究过算法的问题,再加上紧张,就没答上来,人家还提示我“边界问题”。。。其实,找到 与S相等的数之后,看它的前一位数是否小于S,如果是小于,那么 S 就是要找的数,否则,在左侧较小的数列部分继续找。

    代码实现:

    <?php
    $arr = [ 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7 ];
    
    search_num($arr, 4);
    
    function search_num($arr, $search){
        $len = count($arr);
        $start = 0;
        $end = $len-1;
        if($search < $arr[$start] || $search > $arr[$end]){
            var_dump($search .' 不在数列中');
            return;
        }
    
        while (1) {
            $middle = ceil(($start+$end)/2);
            var_dump('index: '.$middle.', middle: '.$arr[$middle]);
    
            if($search == $arr[$middle] && $search > $arr[$middle-1]){
                var_dump($search .' 在数列中的第'.$middle.'位');
                return;
            }
    
            if($search <= $arr[$middle]){
                $end = $middle;
                continue;
            }
    
            if($search > $arr[$middle]){
                $start = $middle;
                continue;
            }
        }
    }
    
    /* 输出结果:
    /www/test/sort.php:100:string 'index: 14, middle: 4' (length=20)
    /www/test/sort.php:100:string 'index: 7, middle: 3' (length=19)
    /www/test/sort.php:100:string 'index: 11, middle: 3' (length=20)
    /www/test/sort.php:100:string 'index: 13, middle: 4' (length=20)
    /www/test/sort.php:103:string '4 在数列中的第13位' (length=25)
    */
    

    哎,其实没有什么难度,记录一下自己糟糕的经历吧。。。

    相关文章

      网友评论

          本文标题:记录曾遇到的一个二分查找问题

          本文链接:https://www.haomeiwen.com/subject/gfswxqtx.html