使用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 相关文章推荐
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
PHP 危险函数全解析
Sep 09 PHP
php explode函数实例代码
Feb 27 PHP
基于PHP array数组的教程详解
Jun 05 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php+mysql实现无限分类实例详解
Jan 15 PHP
php实现简单的MVC框架实例
Sep 23 PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 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
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
微信小程序文章详情页面实现代码
2018/09/10 Javascript
九步学会Python装饰器
2015/05/09 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
Python super()函数使用及多重继承
2020/05/06 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python中pass的作用与使用教程
2020/11/13 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
四年级数学教学反思
2014/02/02 职场文书
村委会换届选举方案
2014/05/03 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
购房委托书
2014/10/15 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
Html5生成验证码的示例代码
2021/05/10 Javascript
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
mysql的数据压缩性能对比详情
2021/11/07 MySQL