php二分查找二种实现示例

时间:2023-11-21 00:40:13 

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,二分查找
0
投稿

猜你喜欢

  • php5.2 Json不能正确处理中文、GB编码的解决方法

    2023-10-26 13:49:28
  • 在Python中进行自动化单元测试的教程

    2023-07-16 04:12:30
  • Django跨域请求CSRF的方法示例

    2021-07-13 21:09:34
  • python自动化办公操作PPT的实现

    2023-06-14 03:43:47
  • PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数

    2023-11-19 07:25:14
  • SQL Server 总结复习 (二)

    2024-01-22 23:14:50
  • 详解Python中while无限迭代循环方法

    2022-08-17 12:53:48
  • windows 7安装ORACLE 10g客户端的方法分享

    2012-07-11 15:36:18
  • 在Python中字典根据多项规则排序的方法

    2023-09-12 00:51:38
  • Python 匹配任意字符(包括换行符)的正则表达式写法

    2023-01-23 23:11:09
  • Django框架表单操作实例分析

    2022-01-27 23:43:59
  • Python3中的json模块使用详解

    2021-09-27 22:21:22
  • Python数据可视化编程通过Matplotlib创建散点图代码示例

    2022-01-04 17:23:34
  • Python文件操作和异常处理的方法和技巧

    2021-05-22 10:54:10
  • 详解Python Flask框架的安装及应用

    2022-06-20 11:12:50
  • python学习字符串驻留与常量折叠隐藏特性详解

    2021-01-19 14:40:10
  • 简单了解SQL常用删除语句原理区别

    2024-01-14 22:38:57
  • switchery按钮的使用方法

    2024-04-29 13:40:44
  • 兼容IE,FF的弹出层登陆界面代码

    2008-01-04 12:13:00
  • 如何使用Python进行OCR识别图片中的文字

    2021-05-05 13:11:07
  • asp之家 网络编程 m.aspxhome.com