PHP中数组二分查找的实现
我最近一直在阅读和观看编程理论的讲座,这让我想起了我在大学学到的这个算法。二进制搜索数组是一种分治算法,它采用一个数组并通过将数组分成两半来搜索该数组中的值。算法是这样工作的。
给定一个排序数组,找到中点。
如果中点的值大于要搜索的值,则该值必须位于数组的前半部分。
如果中点的值小于要搜索的值,则该值必须位于数组的前半部分。
取有问题的数组的一半,并通过重新指向中点来重复第一步。
重复此操作,直到数组的长度为1或0。如果数组长度为1,则这就是值。如果数组的长度为0,则该值不在数组中。
有一些实现细节可以确保中间值是正确的,并避免从数组的末尾跑掉。
这是该算法在PHP中的实现。
/** * Use binary search to find a key of a value in an array. * * @param array $array * The array to search for the value. * @param int $value * A value to be searched. * * @return int|null * Returns the key of the value in the array, or null if the value is not found. */ function binarySearch($array, $value) { //将左指针设置为0。 $left = 0; //将右指针设置为数组的长度-1。 $right = count($array) - 1; while ($left <= $right) { //将初始中点设置为数组长度一半的向下舍入值。 $midpoint = (int) floor(($left + $right) / 2); if ($array[$midpoint] < $value) { //中点值小于该值。 $left = $midpoint + 1; } elseif ($array[$midpoint] > $value) { //中点值大于该值。 $right = $midpoint - 1; } else { //这是我们正在寻找的关键。 return $midpoint; } } //未找到该值。 return NULL; }
为了对这个算法运行一些测试,我运行了以下代码。所有这些都打印为真。
//生成数组。 $array = range(0, 10); //遍历数组,搜索每个值。 foreach ($array as $key => $value) { echo var_export(binarySearch($array, $value) === $value, TRUE) . PHP_EOL; } //搜索数组外的值。 echo var_export(binarySearch($array, -1) === NULL, TRUE) . PHP_EOL; echo var_export(binarySearch($array, 11) === NULL, TRUE) . PHP_EOL;
这是一个简洁的小算法,非常适合搜索排序数据的数组,其中数组的键是连续的。比简单地遍历数组以查找值要高效得多。