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 相关文章推荐
基于mysql的论坛(4)
Oct 09 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
基于PHP+Ajax实现表单验证的详解
Jun 25 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
php验证session无效的解决方法
Nov 04 PHP
PHP+MySQL删除操作实例
Jan 21 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
php5与php7的区别点总结
Oct 11 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
Python使用turtule画五角星的方法
2015/07/09 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Python自带的IDE在哪里
2020/07/01 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
网站文案策划岗位职责
2015/04/14 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
DSP接收机前端设想
2022/04/05 无线电