当前位置:首页 > PHP教程 > php应用 > 列表

php二分查找二种实现示例

发布:smiling 来源: PHP粉丝网  添加日期:2020-10-27 13:43:59 浏览: 评论:0 

这篇文章主要介绍了php二分查找的二种实现示例,递归解法二分查找和非递归算法二分查找的示例,需要的朋友可以参考下。

php二分查找示例

二分查找常用写法有递归和非递归,在寻找中值的时候,可以用插值法代替求中值法。

当有序数组中的数据均匀递增时,采用插值方法可以将算法复杂度从中值法的lgN减小到lglgN,代码如下:

  1. /** 
  2.  * 二分查找递归解法 
  3.  * @param type $subject 
  4.  * @param type $start 
  5.  * @param type $end 
  6.  * @param type $key 
  7.  * @return boolean 
  8.  */ 
  9. function binarySearch_r($subject$start$end$key
  10.  
  11.  if ( $start >= $end ) return FALSE; 
  12.  $mid = getMidKey($subject$start$end$key); 
  13.  if ( $subject[$mid] == $key ) return $mid
  14.  if ( $key > $subject[$mid] ) { 
  15.   return binarySearch($subject$mid$end$key); 
  16.  } 
  17.  if ( $key <= $subject[$mid] ) { 
  18.   return binarySearch($subject$start$mid$key); 
  19.  } 
  20.  
  21. /** 
  22.  * 二分查找的非递归算法 
  23.  * @param type $subject 
  24.  * @param type $n 
  25.  * @param type $key 
  26.  */ 
  27. function binarySearch_nr($subject$n$key
  28.  $low = 0; 
  29.  $high = $n
  30.  while ( $low <= $high ) { 
  31.   $mid = getMidKey($subject$low$high$key); 
  32.   if ( $subject[$mid] == $key ) return $mid
  33.   if ( $subject[$mid] < $key ) { 
  34.    $low = $mid + 1; 
  35.   } 
  36.   if ( $subject[$mid] > $key ) { 
  37.    $high = $mid - 1; 
  38.   } 
  39.  } 
  40. function getMidKey($subject$low$high$key
  41.  /** 
  42.   * 取中值算法1 取中值 不用 ($low+$high)/2的方式是因为 防止low和high较大时候,产生溢出.... 
  43.   */ 
  44.  //return round($low + ($high - $low) / 2); 
  45. //phpfensi.com 
  46.  /** 
  47.   * 经过改进的插值算法求中值,当数值分布均匀情况下,再降低算法复杂度到lglgN 
  48.   * 取中值算法2 
  49.   */ 
  50.  return round( (($key - $subject[$low]) / ($subject[$high] - $subject[$low])*($high-$low) ) ); 

Tags: php二分查找

分享到:

相关文章