使用PHP实现二分查找算法代码分享


Posted in PHP onJune 24, 2011

第一种方法:
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。


【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。


【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

<?php 
//作者:遥远的期待 
//QQ:15624575 
//主页:http://www.phptogether.com/ 
//正向排序的数组 
$arr=array(1,3,5,7,9,11); 
//逆向排序的数组 
$arr2=array(11,9,7,5,3,1); 
//对正向排序的数组进行二分查找 
function searchpart($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 
if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 
$end=$mid-1;//$arr[0]-$arr[1] 
}elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[3]-$arr[5] 
$start=$mid+1; 
}else{//找到了,返回待查值下标 
return $mid; 
} 
} 
} 
//对逆向排序的数组进行二分查找 
function searchpart2($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 
if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 
$start=$mid+1;//$arr[3]-$arr[5] 
}elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[0]-$arr[1] 
$end=$mid-1; 
}else{//找到了,返回待查值下标 
return $mid; 
} 
} 
} 
echo searchpart2($arr,5).'<br>'; 
echo searchpart2($arr2,5); 
?>

PHP的二分查找算法实现
最近整理了下以前学习的算法知识,虽然在WEB开发时算法用到的情况比较少,但还是把一些有用的算法做下备份。
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
【基本思想】
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
PHP的二分查找算法实现
/** 
* 二分查找算法 
* 
* @param array $arr 有序数组 
* @param int $val 查找的数值 
* @return int 查找值存在返回数组下标,不存在返回-1 
*/ 
function binary_search($arr,$val) 
{ 
$l = count($arr);//获得有序数组长度 
$low = 0; 
$high = $l -1; 
while($low <= $high) 
{ 
$middle = floor(($low + $high) / 2); 
if($arr[$middle] == $val) 
{ 
return $middle; 
} 
elseif($arr[$middle] > $val) 
{ 
$high = $middle - 1; 
} 
else 
{ 
$low = $middle + 1; 
} 
} 
return -1; 
} 
//示例 
$arr = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99); 
echo binary_search($arr,57);
PHP 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
PHP求最大子序列和的算法实现
Jun 24 #PHP
php中转义mysql语句的实现代码
Jun 24 #PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 #PHP
php中对2个数组相加的函数
Jun 24 #PHP
php判断输入不超过mysql的varchar字段的长度范围
Jun 24 #PHP
PHP array操作10个小技巧分享
Jun 23 #PHP
php 缩略图实现函数代码
Jun 23 #PHP
You might like
一个PHP分页类的代码
2011/05/18 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python 自动化表单提交实例代码
2017/06/08 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
python邮件发送smtplib使用详解
2020/06/16 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
2014年会策划方案
2014/05/11 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
不错的求职信范文
2014/07/20 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
开票员岗位职责
2015/02/12 职场文书
项目负责人岗位职责
2015/02/15 职场文书
第二次离婚起诉书
2015/05/18 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS