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 相关文章推荐
利用static实现表格的颜色隔行显示
Oct 09 PHP
也谈php网站在线人数统计
Apr 09 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
PHP框架Laravel的小技巧两则
Feb 10 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
简单谈谈PHP中的trait
Feb 25 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
PHP通过文件保存和更新信息的方法分析
Sep 12 PHP
基于php+MySql实现学生信息管理系统实例
Aug 04 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下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
如何基于python实现不邻接植花
2020/05/01 Python
Python调用C/C++的方法解析
2020/08/05 Python
如何使用PHP session
2015/04/21 面试题
个人应聘自我评价分享
2013/11/18 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
企业口号大全
2014/06/12 职场文书
《窃读记》教学反思
2016/02/18 职场文书
详解Python牛顿插值法
2021/05/11 Python