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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
一个简单的PHP入门源程序
Oct 09 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
php解析url的三个示例
Jan 20 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
php输出图像的方法实例分析
Feb 16 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
php图片裁剪函数
Oct 31 PHP
php解析非标准json、非规范json的方式实例
Dec 10 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
cache_lite试用
2007/02/14 PHP
php中变量及部分适用方法
2008/03/27 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
Vue表单实例代码
2016/09/05 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
Python如何给函数库增加日志功能
2020/08/04 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
进步之星获奖感言
2014/02/22 职场文书
学习经验交流会主持词
2014/04/01 职场文书
安全生产标语
2014/06/06 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
好人好事演讲稿
2014/09/01 职场文书
购房协议书范本
2014/10/02 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
感恩教育观后感
2015/06/17 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
Python读写yaml文件
2022/03/20 Python
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android