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邮件专题
Oct 09 PHP
php str_pad 函数用法简介
Jul 11 PHP
如何在php中正确的使用json
Aug 06 PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
Laravel模型事件的实现原理详解
Mar 14 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
杏林同学录(五)
2006/10/09 PHP
Snoopy类使用小例子
2008/04/15 PHP
php include,include_once,require,require_once
2008/09/05 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
精彩广告词大全
2014/03/19 职场文书
cf战队收人口号
2014/06/21 职场文书
建筑施工安全责任书
2014/07/24 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
银行先进个人总结
2015/02/15 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
《刷子李》教学反思
2016/02/20 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
python实现三阶魔方还原的示例代码
2021/04/28 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python