我有一个函数可以给我一个数字:
现在为了简单起见,我将使用一个发明的例子:
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);
你能帮助我吗?
祝你好运, 乔治
答案 0 :(得分:1)
对于二进制搜索,这是您想要做的事情:
generate()
值:
find()
,其中包含中间前所有元素的列表,然后返回。find()
,其中包含中间后面的所有元素的列表,然后返回。答案 1 :(得分:1)
虽然这可能是一些学术研究的好尝试,但在实践中我认为它比简单的渐进式方法慢。
您想要的是优化generate()
(或称为*的方式)而不是遍历算法。
*其中一个改进就是取代它:
foreach($array as $k=>$v) $array[$k] = generate($v);
有了这个:
$array = array_map('generate', $array);