使用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与SQL注入攻击[三]
Apr 17 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
PHP借助phpmailer发送邮件
May 11 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
PHP数组实例详解
Jun 26 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
PHP中phar包的使用教程
Jun 14 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
PHP命名空间用法实例分析
Sep 04 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
Smarty局部缓存的几种方法简介
2014/06/17 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
python插入排序算法实例分析
2015/07/03 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
出国考察邀请函
2014/01/21 职场文书
大学生创业策划书
2014/02/02 职场文书
社区工作感言
2014/02/21 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技