PrepStack · Markdown HTML

有序域二分查找

二分与单调答案 · HTML

数学 / 逻辑形态

维护闭区间 [lo,hi],不变量为“若 target 存在,则仍在区间内”。比较 a[mid] 与 target 后排除不可能的一侧。

识别信号

容易误判的相似信号

SignalWhy it is different
First True 边界若要首个/末个位置,不应命中立即返回;改用 boundary 模板保留候选。
答案空间二分输入未必有序而可行性单调时,搜索的是答案值,不是数组下标。

核心不变量

循环开始时,若 target 存在,它必位于闭区间 [lo,hi];区间外已被比较证明不可能。

状态、转移与处理顺序

ItemDefinition
Statelo、hi、mid 与 target;闭区间为空的判据是 lo>hi。
Transitiona[mid]<target 则 lo=mid+1;a[mid]>target 则 hi=mid-1;相等立即返回。
Frontier / order尚未排除的连续索引区间,而非队列或堆。

Python 骨架

def binary_search(a, target):
    lo, hi = 0, len(a) - 1
    while lo <= hi:
        mid = lo + (hi - lo) // 2
        if a[mid] == target:
            return mid
        if a[mid] < target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1

正确性思路

  1. 有序性保证 a[mid]<target 时 mid 及其左边都不可能命中,反向同理。
  2. 每次把 mid 排除,区间严格缩小,最终终止。
  3. 命中时显然正确;区间为空仍未命中,按不变量目标不存在。

复杂度

TimeSpaceParameters
O(log n)O(1)n 为序列长度;每轮候选规模至少减半。

边界条件

错误模式

PatternWhy it fails / fix
闭区间却写 lo<hi可能漏检最后一个候选;闭区间精确搜索用 lo<=hi。
更新不排除 mid写 lo=mid 或 hi=mid 可在相邻元素时死循环。
旋转数组照搬比较整体不再有序,需先判断哪一半有序。

选择与排除规则

相关模板

RelationTemplateBoundary
搜索域抽象答案空间二分有序对象不是数组元素而是可行性答案。
精确搜索基础二分边界 / First True有序比较可被改写为边界谓词。
structural-analogyBST 有序性 / 中序遍历BST 比较排除一棵子树,数组二分排除一半区间。
同用有序性相向双指针目标是配对/夹逼而非单值定位。

原创微型例子

环节内容
Result返回索引 3。
Setup有序序列 [3,8,12,19,25] 中找 19。
Tracemid=2 值 12,排除左半;新 mid=3 命中。

Recall prompts

我的补充