php二分查找二种实现示例
PHP二分查找的奥秘:递归与非递归实现示例
在PHP中,二分查找是一种高效的搜索算法,适用于已排序的数组。它主要有两种实现方式:递归解法与非递归算法。接下来,让我们一起这两种方法的实现示例。
一、二分查找递归解法
我们来了解二分查找的递归解法。在递归过程中,我们通过不断缩小搜索范围来寻找目标值。当搜索范围缩小至只有一个元素时,我们就找到了目标值或者确定目标值不存在。
代码如下:
```php
function binarySearch_r($subject, $start, $end, $key) {
if ($start >= $end) return FALSE; // 搜索范围无效,返回FALSE
$mid = getMidKey($subject, $start, $end); // 获取中间值索引
if ($subject[$mid] == $key) return $mid; // 找到目标值,返回索引
if ($key > $subject[$mid]) {
return binarySearch_r($subject, $mid+1, $end, $key); // 在右半部分继续搜索
} else {
return binarySearch_r($subject, $start, $mid, $key); // 在左半部分继续搜索
}
}
```
二、二分查找的非递归算法
除了递归解法,我们还可以使用非递归算法来实现二分查找。非递归算法通过循环来逐步缩小搜索范围,直至找到目标值或确定目标值不存在。
代码如下:
```php
function binarySearch_nr($subject, $n, $key) {
$low = 0; // 搜索范围下限
$high = $n - 1; // 搜索范围上限
while ($low <= $high) { // 当搜索范围有效时继续循环
$mid = getMidKey($subject, $low, $high); // 获取中间值索引
if ($subject[$mid] == $key) return $mid; // 找到目标值,返回索引
if ($subject[$mid] < $key) { // 目标值在中间值的右侧
$low = $mid + 1; // 更新搜索范围下限
} else { // 目标值在中间值的左侧
$high = $mid - 1; // 更新搜索范围上限
}
}
return FALSE; // 未找到目标值,返回FALSE
}
```
三、取中值算法的优化
在二分查找中,取中值算法是非常关键的一环。除了常用的求中值法,我们还可以采用插值法来进一步优化算法。当有序数组中的数据分布均匀时,插值法可以将算法复杂度降低到lglgN。下面是改进后的取中值算法示例:
```php
function getMidKey($subject, $low, $high, $key) {
// 经过改进的插值法求中值
return round((($key - $subject[$low]) / ($subject[$high] - $subject[$low])) ($high - $low));
}
```
PHP二分查找的递归和非递归实现各有特点,根据实际需求选择适合的算法。通过优化取中值算法,我们可以进一步提高二分查找的效率。希望本文的介绍能帮助您更好地理解PHP二分查找的实现原理。
编程语言
- php二分查找二种实现示例
- vue通过数据过滤实现表格合并
- 移动端js图片查看器
- PHP模拟http请求的方法详解
- 详解auto-vue-file-一个自动创建vue组件的包
- IP地址与整数之间的转换实现代码(asp.net)
- angularjs在ng-repeat中使用ng-model遇到的问题
- vue axios请求频繁时取消上一次请求的方法
- jQuery实现web页面樱花坠落的特效
- Asp.Net Core2.1前后使用HttpClient的两种方式
- JavaScript数据库TaffyDB用法实例分析
- 多个vue子路由文件自动化合并的方法
- php分页查询的简单实现代码
- vue项目中使用axios上传图片等文件操作
- PHP递归遍历文件夹去除注释并压缩php源代码的方
- js实现页面跳转的五种方法推荐