Php 数组中的二进制搜索
我为二进制搜索编写了这段代码 但它也有一些问题。有人能帮我写更好的代码吗Php 数组中的二进制搜索,php,arrays,Php,Arrays,我为二进制搜索编写了这段代码 但它也有一些问题。有人能帮我写更好的代码吗 函数bs($a,$val,$low,$high){ 如果($高$val){ 返回bs($a,$val,$low,$mid-); }否则,如果($a[$mid]值) 返回二进制搜索(A、值、低、中1) else if(A[mid]
函数bs($a,$val,$low,$high){
如果($高<$低){
返回打印“未找到”;
}
$mid=$low+($high-$low)/2);
如果($a[$mid]>$val){
返回bs($a,$val,$low,$mid-);
}否则,如果($a[$mid]值)
返回二进制搜索(A、值、低、中1)
else if(A[mid]<值)
返回二进制搜索(A,值,中+1,高)
其他的
返回中//找到
}
问题是你必须投
(($high-$low)/2)
整型
intval(($high-$low)/2)
也叫
bs ($a,$val,$low,$mid--);
bs ($a,$val,$low,$mid++);
将在函数调用后减少/增加$mid,因此您应该使用
bs ($a,$val,$low,$mid-1);
bs ($a,$val,$low,$mid+1);
此外,PHP代码与您在下面编写时发布的伪代码不匹配
return bs ($a,$val,$low,$mid+1);
应该是
return bs ($a,$val,$mid+1,$high);
最后我不认为
return print 'found';
return print 'not found';
将给出预期的行为:
return -1;
return $mid;
所以整件事就变成了
function bs ($a,$val,$low,$high){
if ($high < $low){
return -1;
}
$mid= $low + intval(($high-$low)/2);
if ($a[$mid]>$val){
return bs ($a,$val,$low,$mid-1);
}else if ($a[$mid]<$val){
return bs ($a,$val,$mid+1,$high);
}else{
return $mid;
}
}
$array=array(1,2,3,4,5,6,7);
$idx = bs ($array,5,0,6);
if($idx==-1)
{
echo 'not found';
}
else
{
echo 'Found at index' . $idx;
}
函数bs($a,$val,$low,$high){
如果($高<$低){
返回-1;
}
$mid=$low+intval($high-$low)/2);
如果($a[$mid]>$val){
返回bs($a、$val、$low、$mid-1);
}else if($a[$mid]$data_set=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
$search_item=19;
函数二进制搜索($search\u item,$data\u set){
$start=0;
$end=计数($data\u set)-1;
while($start$data\u set[$mid]){
$start=$mid+1;
}elseif($search\u item==$data\u set[$mid]){
返回'index='.$mid.'和value='.$search\u项;
}
}
返回-1;
}
变量转储(二进制搜索($search\u item,$data\u set));
但是有一些问题
——如果您不告诉我们,我们怎么知道问题出在哪里?什么不起作用?预期的结果是什么?您得到了什么?致命错误:允许的1073741824字节的内存已用尽(尝试分配65488字节)在第15行的D:\xampp\htdocs\bin2.php中,看起来您可能有一个带有递归函数的无限循环。您没有考虑非偶数除法。$mid可能会变成类似于2.5
,然后变成2.25、2.125等等……并且您永远不会停止递归。
$data_set = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
$search_item = 19;
function binary_search($search_item,$data_set){
$start = 0;
$end = count($data_set) - 1;
while($start <= $end ){
$mid = floor(($start + $end) / 2);
if($search_item < $data_set[$mid]){
$end = $mid - 1;
}elseif($search_item > $data_set[$mid]){
$start = $mid + 1;
}elseif($search_item == $data_set[$mid]){
return 'index=='.$mid.' and value=='.$search_item;
}
}
return -1;
}
var_dump(binary_search($search_item,$data_set));