假设我有一个类似于此的数组(实际值可能不会如此可预测):
$ar[0] = 5;
$ar[1] = 10;
$ar[2] = 15;
$ar[3] = 20;
我有$n = 8
,找到$n
介于$ar[0]
和$ar[1]
之间的好方法是什么?优选地,该解决方案将避免在整个阵列中循环,因为这可能在不同大小的阵列上重复多次。
编辑:
是的,数组将始终排序。
答案 0 :(得分:5)
如果您的数组始终在底部以较小的值排序,则可以循环直到达到大于可比较数字的数组。当您到达该点时,记录密钥或到达那里所需的迭代次数。
答案 1 :(得分:1)
如果您不想遍历整个数组,并且您的数组已排序,您可以从中间开始,比较您要查找的值,并根据结果选择上半部分或下半部分继续使用数组。
答案 2 :(得分:1)
这是最简单的任务。
<?php
$minDiff = end($array);
$takeLesser = true;
if ($inputValue > $minDiff) {
$itemKey = key($array);
} else {
foreach ($array as $key => $value) {
$diff = abs($value - $inputValue);
if ($minDiff < $diff) {
break;
}
if ($minDiff == $diff && $takeLesser) {
continue;
}
$minDiff = $diff;
$itemKey = $key;
}
}
$result = $array[$itemKey];
答案 3 :(得分:0)
PHP在框架中内置了一个array_search函数,但它本身不使用二进制搜索。 PHP array_search条目的补充:
<?php
function array_bsearch( $needle, $haystack, $comparator ) {
$high = Count( $haystack ) -1;
$low = 0;
while ( $high >= $low ){
$probe = Floor( ( $high + $low ) / 2 );
$comparison = $comparator( $haystack[$probe], $needle );
if ( $comparison < 0 ) {
$low = $probe +1;
} elseif ( $comparison > 0 ) {
$high = $probe -1;
} else {
return $probe;
}
}
// ---The loop ended without a match
return -1;
}
?>