📜  PHP中的二进制搜索(1)

📅  最后修改于: 2023-12-03 14:45:28.245000             🧑  作者: Mango

PHP中的二进制搜索

二进制搜索是一种常用的搜索算法,它通过将已排序的数组分成两部分,查找目标值所在的那一部分,再在该部分中重复此过程直到找到目标值。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