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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
Yii操作数据库的3种方法
Mar 11 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
php实现httpRequest的方法
Mar 13 PHP
php实现的递归提成方案实例
Nov 14 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
php数组函数array_walk用法示例
May 26 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 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
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
Vue 进阶之路(三)
2019/04/18 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
Python的面向对象思想分析
2015/01/14 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
pywinauto自动化操作记事本
2019/08/26 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
毕业设计计划书
2014/01/09 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
护士辞职信怎么写
2015/02/27 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
女性励志书籍推荐
2019/08/19 职场文书
商业计划书之服装
2019/09/09 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android