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 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
PHP+jQuery实现自动补全功能源码
May 15 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
php运行时动态创建函数的方法
Mar 16 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python多进程控制学习小结
2018/10/31 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
一篇.NET面试题
2014/09/29 面试题
《花的勇气》教后反思
2014/02/12 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
自荐信的基本格式
2014/02/22 职场文书
商超业务员岗位职责
2014/03/12 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
python中pandas对多列进行分组统计的实现
2021/06/18 Python
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL