给定N个数组的数组$数组和一个键$ key,用简单的英语编写二进制搜索算法。如果$ array包含$ key,则返回$ key的索引;否则,返回-1。
有人可以告诉我该怎么做吗?
答案 0 :(得分:7)
似乎我不应该在这里给你代码,但是这个描述可能有帮助吗?
对列表进行排序。
让i = length / 2
将索引i
的字词与您的密钥进行比较。
一个。如果它们相等,则返回索引。
湾如果密钥大于此术语,请在列表i = (i + length) / 2
的上半部分(或(i + top) / 2
重复3(递归),具体取决于您的实施方式)
℃。如果密钥小于此字词,请在下半部分i = i/2
或(i + bottom)/2
如果/当新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;
}