php面试之二分查找法

来源:互联网 发布:手机聊天软件 编辑:程序博客网 时间:2024/05/23 21:28

二分查找法:

在一个升序或者降序的数组中(数组最好不要有重复值,如果有重复值只会找到其中某一个值得位置)寻找其中元素与我要找的值相等,有的话找出他的位置。

二分法究竟是什么意思。从数学上解释,如有有100个升序或降序排列的互相不想等的随机数。我们要找到其中是否有88,在哪一个位置。

哪有人会说,这有什么意义?

查找方法有很多种,二分法是其中一种,从理论上说,当数据量十分巨大是二分查找法就会相应提高查找效率,可想而知,每一次的二分都可以过滤一半的数据,

减少了查询的次数。

<?php/** * Created by PhpStorm. * User: 夏骏 * Date: 2017/3/9 * Time: 11:29 */function Msort(array $number){    $sum=count($number);    for($i=0;$i<$sum-1;$i++){        for($j=0;$j<$sum-$i-1;$j++){            if($number[$j]>$number[$j+1]){                $lishi=$number[$j];                $number[$j]=$number[$j+1];                $number[$j+1]=$lishi;            }        }    }    return $number;}$number=array(9,3,6,1,12,30,22,43,78,56,32,47,98,86,18);function Href(array $number,$search,$key=1,$low=0,$high=0,$sum=1){    $sum++;    if (count($number) > 2) {        if ($key == 1) {            $number = Msort($number);            echo '<pre>';            var_dump($number);        }        if ($low == 0) {            $low = 0;        }        if ($high == 0) {            $high = count($number);        }        $href = intval(($low + $high) / 2);        if ($search == $number[$href]) {            $fanhui = $href + 1 . ' time =' . $sum;            return $fanhui;        }        if ($search > $number[$href]) {            for ($i = $low; $i <= $href; $i++) {                unset($number[$i]);            }            $low = $href + 1;            return href($number, $search, 0, $low, $high, $sum);        } else {            if ($high == count($number)) {                for ($i = $href; $i < $high-1; $i++) {                    unset($number[$i]);                }            } else {                for ($i = $href; $i < $high; $i++) {                    unset($number[$i]);                }            }            $high = $href - 1;            return href($number, $search, 0, $low, $high, $sum);        }    } else {        $fanhui = 'not found times =' . $sum;        return $fanhui;    }}echo href($number,12);

这边是我写的一个递归的二分查找发,里面包含了一个sort方法也就是冒泡排序。

$sum参数是我用来记录查询次数的。我之前有介绍过冒泡排序这里就不表了。二分法的代码设计思路就是用数组的key来实现二分,第一次时,用0做最小值的key,

count(数组)做最大值的key,两个key相加除以2,得到中间key。用中间key的value来一比较数$search对比可能出现三种情况:

1:value=$search

这时我们输出key值和查询次数。

2:value>$search

这时我们发现搜索值是小于当前的值也就是说我要查询的数字应该是在上半区。

我们保存原有的$low值,把$high重置为榜前key-1后再次执行搜索。

3:valeu=$search

这时我们发现搜索值大于当前的值也就是说我要查询的数字在下半区。

我们报错原有的$high,把$low修改成当前key+1后再次执行搜索。

当搜索区域只有一个元素的时候也就是最后一次搜索。

如此便完成了这个程序设计。

希望对大家能有帮助。


0 0
原创粉丝点击