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 数组的创建、调用和更新实现代码
Mar 09 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
Jul 22 PHP
php 发送带附件邮件示例
Jan 23 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
PHP 搜索查询功能实现
Nov 29 PHP
php登录超时检测功能实例详解
Mar 21 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 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
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
大一学生的职业生涯规划书范文
2014/01/19 职场文书
工程技术员岗位职责
2014/03/02 职场文书
年终晚会主持词
2014/03/25 职场文书
节能减排倡议书
2014/04/15 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
2015年校长新年寄语
2014/12/08 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
Redis 限流器
2022/05/15 Redis