php中的递归二进制搜索

时间:2012-01-22 19:47:42

标签: php search recursion

我有一个函数可以给我一个数字:

现在为了简单起见,我将使用一个发明的例子:

   function generate($a) {return $a*2;}
   //this is just an example, the real generate function is really expensive in terms of speed and resources

我还有一个数组,其值传递给该函数:

$array = array(1,3,4,6,8,9,11);

我想找到$ array的值,传递给generate(),给出最接近5的数字和它的次要数字。

通过渐进式搜索,我会得到这个:

$array[0] => 2;
$array[1] => 6;
$array[2] => 8;
etc.

在这种情况下,我希望我的搜索功能将数字1作为输出,因为这是传入generate()的值,输出为2,最接近的数字为5,小数为5。

由于generate()函数非常慢(平均1.5秒),我想进行二分查找,希望减少函数的使用。

基本上我想做的是:将$ array切成2块,使用generate(),然后切片等等。

我不是递归函数和二进制搜索的专家(这是我尝试这样做的第一个脚本)。

但是我试着编写一些我在下面粘贴的代码,但是它不起作用而且我没有清楚的想法。

function generate($a) {return $a*2;}

$array = array(1,2,3,4,5,6,7,8,9);

function find($array) {
    $first_half = array_slice($array,0,round(count($array)/2,0));
    $second_half = array_slice($array,round(count($array)/2,0));
    echo "<pre>";
    print_r($first_half);
    print_r($second_half);
    echo "</pre>";
    $last = end($first_half);
    $last = generate($last);

    if($last > 4) {find($first_half);}
    else {}
}

find($array);

你能帮助我吗?

祝你好运, 乔治

2 个答案:

答案 0 :(得分:1)

对于二进制搜索,这是您想要做的事情:

  • 如果您要搜索的列表只有一个元素,则将该元素作为答案返回。
  • 否则,找到最接近中间的元素(如果列表中有偶数个元素,它将不完美,只是向下舍入)。
  • 计算该中间元素的generate()值:
    • 如果结果为5(或您正在寻找的任何值),则将该中间元素作为答案返回。
    • 如果结果大于5,则递归调用find(),其中包含中间前所有元素的列表,然后返回。
    • 如果结果小于5,则递归调用find(),其中包含中间后面的所有元素的列表,然后返回。

答案 1 :(得分:1)

虽然这可能是一些学术研究的好尝试,但在实践中我认为它比简单的渐进式方法慢。

您想要的是优化generate()(或称为*的方式)而不是遍历算法。


*其中一个改进就是取代它:

foreach($array as $k=>$v) $array[$k] = generate($v);

有了这个:

$array = array_map('generate', $array);