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 相关文章推荐
桌面中心(二)数据库写入
Oct 09 PHP
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
php对数组排序代码分享
Feb 24 PHP
PHP header()函数常用方法总结
Apr 11 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
Yii2中datetime类的使用
Dec 17 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
跟老齐学Python之关于类的初步认识
2014/10/11 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
python 2.7.14安装图文教程
2018/04/08 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
学生党员批评与自我批评
2014/10/15 职场文书
财务工作检讨书
2014/10/29 职场文书
入党自传范文2015
2015/06/26 职场文书
中秋晚会致辞
2015/07/31 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书