php二分查找二种实现示例


Posted in PHP onMarch 12, 2014

php二分查找示例

二分查找常用写法有递归和非递归,在寻找中值的时候,可以用插值法代替求中值法。
当有序数组中的数据均匀递增时,采用插值方法可以将算法复杂度从中值法的lgN减小到lglgN

/**
 * 二分查找递归解法
 * @param type $subject
 * @param type $start
 * @param type $end
 * @param type $key
 * @return boolean
 */
function binarySearch_r($subject, $start, $end, $key)
{
 if ( $start >= $end ) return FALSE;
 $mid = getMidKey($subject, $start, $end, $key);
 if ( $subject[$mid] == $key ) return $mid;
 if ( $key > $subject[$mid] ) {
  return binarySearch($subject, $mid, $end, $key);
 }
 if ( $key <= $subject[$mid] ) {
  return binarySearch($subject, $start, $mid, $key);
 }
}
/**
 * 二分查找的非递归算法
 * @param type $subject
 * @param type $n
 * @param type $key
 */
function binarySearch_nr($subject, $n, $key)
{
 $low = 0;
 $high = $n;
 while ( $low <= $high ) {
  $mid = getMidKey($subject, $low, $high, $key);
  if ( $subject[$mid] == $key ) return $mid;
  if ( $subject[$mid] < $key ) {
   $low = $mid + 1;
  }
  if ( $subject[$mid] > $key ) {
   $high = $mid - 1;
  }
 }
}
function getMidKey($subject, $low, $high, $key)
{
 /**
  * 取中值算法1 取中值 不用 ($low+$high)/2的方式是因为 防止low和high较大时候,产生溢出....
  */
 //return round($low + ($high - $low) / 2);
 /**
  * 经过改进的插值算法求中值,当数值分布均匀情况下,再降低算法复杂度到lglgN
  * 取中值算法2
  */
 return round( (($key - $subject[$low]) / ($subject[$high] - $subject[$low])*($high-$low) ) );
}
PHP 相关文章推荐
php adodb操作mysql数据库
Mar 19 PHP
两个开源的Php输出Excel文件类
Feb 08 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
php bootstrap实现简单登录
Mar 08 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
php遍历文件夹和文件列表示例分享
Mar 11 #PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 #PHP
php上传图片存入数据库示例分享
Mar 11 #PHP
php使用反射插入对象示例分享
Mar 11 #PHP
php数组编码转换示例详解
Mar 11 #PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 #PHP
PHP输出缓存ob系列函数详解
Mar 11 #PHP
You might like
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
JS实现星星海特效
2019/12/24 Javascript
详解vue路由
2020/08/05 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
房屋租赁协议书(标准版)
2014/10/02 职场文书
教师节倡议书2015
2015/04/27 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers