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+javascript模拟Matrix画面
Oct 09 PHP
APMServ使用说明
Oct 23 PHP
一个可以找出源代码中所有中文的工具
Oct 25 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
php用户注册页面利用js进行表单验证具体实例
Oct 17 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
laravel 创建命令行命令的图文教程
Oct 23 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 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
超级实用的7个PHP代码片段分享
2012/01/05 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
JavaScript中的this使用详解
2016/07/27 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
联强国际笔试题面试题
2013/07/10 面试题
override和overload的区别
2016/03/09 面试题
策划主管的工作职责
2013/11/24 职场文书
学校安全生产承诺书
2014/05/23 职场文书
2014年科普工作总结
2014/12/06 职场文书
社团个人总结范文
2015/03/05 职场文书
员工自我工作评价
2015/03/06 职场文书
七一活动主持词
2015/06/29 职场文书
董事长致辞
2015/07/29 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers