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 缓存函数代码
Aug 27 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
php文件上传后端处理小技巧
May 22 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
PHP遍历数组的6种方式总结
Nov 17 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之数据库操作详解及乱码解决!
2007/01/02 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
python快速排序代码实例
2013/11/21 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python中一些深不见底的“坑”
2019/06/12 Python
django和flask哪个值得研究学习
2020/07/31 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
政法大学毕业生自荐信范文
2014/01/01 职场文书
店长职务说明书
2014/02/04 职场文书
党支部承诺书范文
2014/03/28 职场文书
财务担保书范文
2014/04/02 职场文书
党员四风剖析材料
2014/08/27 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS