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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
smarty 原来也不过如此~~呵呵
Nov 25 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 PHP
PHP7新特性
Mar 09 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实现PDO的mysql数据库操作类
2014/12/12 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Python中实现对list做减法操作介绍
2015/01/09 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
浅谈Python处理PDF的方法
2017/11/10 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python实现人脸签到系统
2020/04/13 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
重阳节登山活动方案
2014/02/03 职场文书
企业军训感想
2014/02/07 职场文书
人事科岗位职责范本
2014/03/02 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
家庭贫困证明
2014/09/23 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫