当前位置:首页 > PHP

php实现折半查找

2026-02-16 14:46:25PHP

折半查找(二分查找)简介

折半查找是一种针对有序数组的高效查找算法,时间复杂度为 O(log n)。其核心思想是通过不断缩小查找范围,逐步逼近目标值。

PHP 实现折半查找

以下是一个完整的 PHP 实现示例,包含递归和非递归两种方式:

php实现折半查找

非递归实现

function binarySearch($arr, $target) {
    $left = 0;
    $right = count($arr) - 1;

    while ($left <= $right) {
        $mid = floor(($left + $right) / 2);

        if ($arr[$mid] == $target) {
            return $mid; // 找到目标,返回索引
        } elseif ($arr[$mid] < $target) {
            $left = $mid + 1; // 目标在右半部分
        } else {
            $right = $mid - 1; // 目标在左半部分
        }
    }

    return -1; // 未找到
}

// 示例调用
$sortedArray = [1, 3, 5, 7, 9];
$result = binarySearch($sortedArray, 5); // 返回 2

递归实现

function binarySearchRecursive($arr, $target, $left, $right) {
    if ($left > $right) {
        return -1;
    }

    $mid = floor(($left + $right) / 2);

    if ($arr[$mid] == $target) {
        return $mid;
    } elseif ($arr[$mid] < $target) {
        return binarySearchRecursive($arr, $target, $mid + 1, $right);
    } else {
        return binarySearchRecursive($arr, $target, $left, $mid - 1);
    }
}

// 示例调用
$sortedArray = [1, 3, 5, 7, 9];
$result = binarySearchRecursive($sortedArray, 7, 0, count($sortedArray) - 1); // 返回 3

关键注意事项

  1. 数组必须有序:折半查找要求输入数组是升序或降序排列的,否则算法无法正常工作。
  2. 边界条件:循环或递归终止条件是 $left <= $right,避免遗漏边界值。
  3. 中间值计算:使用 floorint 确保 $mid 为整数索引。

性能优化

  • 对于超大数组,递归实现可能引发栈溢出,建议优先选择非递归方式。
  • 若查找范围较大,可通过位运算优化中间值计算:
    $mid = ($left + $right) >> 1;

标签: php
分享给朋友:

相关文章

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…