php面试之二分查找法
来源:互联网 发布:手机聊天软件 编辑:程序博客网 时间:2024/05/23 21:28
二分查找法:
在一个升序或者降序的数组中(数组最好不要有重复值,如果有重复值只会找到其中某一个值得位置)寻找其中元素与我要找的值相等,有的话找出他的位置。
二分法究竟是什么意思。从数学上解释,如有有100个升序或降序排列的互相不想等的随机数。我们要找到其中是否有88,在哪一个位置。
哪有人会说,这有什么意义?
查找方法有很多种,二分法是其中一种,从理论上说,当数据量十分巨大是二分查找法就会相应提高查找效率,可想而知,每一次的二分都可以过滤一半的数据,
减少了查询的次数。
这边是我写的一个递归的二分查找发,里面包含了一个sort方法也就是冒泡排序。<?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);
$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
- php面试之二分查找法
- php二分查找法
- 二分查找法 php
- php二分查找法
- PHP实现常见算法之二分查找法
- php二分查找法实例
- 面试基础 -- 二分查找
- PHP算法之二分查找和顺序查找
- 算法之二分查找法
- 数据结构之二分查找法
- 算法之二分查找法
- 分治法之二分查找
- 算法之二分查找法
- JAVA常用查找之二分查找法
- 查找之二分查找
- 查找之二分查找
- 查找之二分查找
- (java)美团面试之二分查找波谷值
- BeautifulSoup类 笔记
- Android中程序与Service交互的方式——交互方式
- Head First设计模式学习笔记-------(8)外观模式
- Generate C interface from C++ source code using Clang libtooling
- Error: PyInstaller for Python 2.6+ on Windows needs pywin32.
- php面试之二分查找法
- ROS入门入门
- JAVA发送GET请求
- kmp杂题2 poj1961Period
- Java(五)-内部类和异常类
- CCS与Matlab数据交换详解
- z-index之深入理解
- Oracle 12.2多租户架构中监听器监听到的数据库服务
- spfa && poj1860