📅  最后修改于: 2023-12-03 14:45:28.245000             🧑  作者: Mango
二进制搜索是一种常用的搜索算法,它通过将已排序的数组分成两部分,查找目标值所在的那一部分,再在该部分中重复此过程直到找到目标值。PHP语言中已经内置了二分搜索函数。
二分搜索函数binary_search()
的语法如下:
int binary_search(array $array, mixed $search_value [, callable $comp_func ] )
其中,$array
表示待搜索的已排序数组,$search_value
表示要查找的目标值,$comp_func
表示一个可选的回调函数,用于指定数组元素的比较方式。
下面是一个简单的示例,演示如何使用二分搜索函数查找数组中的元素:
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
$search_value = 5;
$key = binary_search($array, $search_value);
if ($key === false) {
echo "值 $search_value 未找到";
} else {
echo "值 $search_value 在数组中的键为 $key";
}
输出结果为:
值 5 在数组中的键为 4
如果 $array
数组中的元素不是简单类型(如,它们是一个自定义对象),或者需要使用自己的比较逻辑来判断元素值的大小,那么可以通过指定回调函数来实现。
下面是另一个示例,演示如何使用回调函数来实现自定义比较:
// 定义一个自定义的对象
class Person
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
// 定义回调函数,按照年龄从小到大排序
function cmp_by_age($a, $b)
{
return $a->age - $b->age;
}
// 创建一个 Person 对象数组
$persons = [];
$persons[] = new Person("Tom", 32);
$persons[] = new Person("Jack", 18);
$persons[] = new Person("Mary", 25);
$persons[] = new Person("Frank", 41);
$persons[] = new Person("Lucy", 36);
$persons[] = new Person("Bob", 21);
// 按照年龄升序排序
usort($persons, "cmp_by_age");
// 搜索年龄为 25 的 Person 对象
$search_value = new Person("", 25);
$key = binary_search($persons, $search_value, function ($a, $b) {
return $a->age - $b->age;
});
if ($key === false) {
echo "值未找到";
} else {
echo "值在数组中的键为 $key";
}
上面的代码会输出:
值在数组中的键为 2