一般编程 - 二进制搜索算法

时间:2011-04-30 15:28:03

标签: php algorithm

给定N个数组的数组$数组和一个键$ key,用简单的英语编写二进制搜索算法。如果$ array包含$ key,则返回$ key的索引;否则,返回-1。

有人可以告诉我该怎么做吗?

3 个答案:

答案 0 :(得分:7)

似乎我不应该在这里给你代码,但是这个描述可能有帮助吗?

  1. 对列表进行排序。

  2. i = length / 2

  3. 将索引i的字词与您的密钥进行比较。

    一个。如果它们相等,则返回索引。

    湾如果密钥大于此术语,请在列表i = (i + length) / 2的上半部分(或(i + top) / 2重复3(递归),具体取决于您的实施方式)

    ℃。如果密钥小于此字词,请在下半部分i = i/2(i + bottom)/2

  4. 上重复3

    如果/当新i与旧i相同时停止递归。这意味着你已经用尽了搜索。返回-1


    请注意逐个错误,这可能会导致您错误地排除某些术语,或导致无限递归,但这是一般性的想法。非常直截了当。

    将其视为为数字1到100播放'猜数字'。你猜一下,我告诉你更高或更低。你说50,我说低了。你说25,我说更高。你说37 ......

答案 1 :(得分:1)

我知道这有点晚了:),但无论如何都要接受它。这也表明递归函数的工作速度比in_array()

 function binarySearch($A,$value,$starting,$ending)
    {
       if($ending<$starting)
       {
          return -1;
       }
       $mid=intVal(($starting+$ending)/2);

       if($value===$A[$mid])
          {
              return $mid;
          }
       else if($value<$A[$mid])
          {
             $ending=$mid-1;
          }
       else if($value>$A[$mid])
          {
             $starting=$mid+1;
          }

       return binarySearch($A,$value,$starting,$ending);
    }

    for($i;$i<1000000;$i++){
       $arr[$i]=$i;
    }
    $value =99999;

    $msc=microtime(true);
    $pos = in_array($value,$arr);
    $msc=microtime(true)-$msc; 

    echo "Time taken for in_array() : ".round($msc*1000,3).' ms <br>';
    if($pos>0)
    echo $value .' found.';
    else
    echo $value .' not found';

    echo "<br><br>";
    $msc=microtime(true);
    $pos = binarySearch($arr,$value ,0,1000000);
    $msc=microtime(true)-$msc; 

    echo "Time taken for recursive function : ".round($msc*1000,3).' ms<br>';
    if($pos>=0)
    echo $value .' found.';
    else
    echo $value .' not found';

输出继电器:

Time taken for in_array() : 5.165 ms 
99999 found.

Time taken for recursive function : 0.121 ms
99999 found.

答案 2 :(得分:0)

这是一个更好的非递归解决方案。

function fast_in_array($elem, $array){
   $top = sizeof($array) -1;
   $bot = 0;

   while($top >= $bot)
   {
      $p = floor(($top + $bot) / 2);
      if ($array[$p] < $elem) $bot = $p + 1;
      elseif ($array[$p] > $elem) $top = $p - 1;
      else return TRUE;
   }

   return FALSE;
}