一、什么是二分法?
核心思想:不断“对半砍”,缩小范围,快速定位目标。
生活比喻:
就像猜数字游戏(1~100之间):
- 你猜50,对方说“大了”,就砍掉后半部分(51->100),在1~49继续猜。
- 每次排除一半的错误答案,快速逼近正确数字。
二、二分法工作原理(看图说话)
前提条件:数据必须排好顺序(从小到大或从大到小)
步骤分解:
- 确定搜索范围:初始化左(
left
)、右(right
)边界。 - 取中间值:
mid = (left + right) // 2
。 - 判断方向:
- 如果
mid
是目标,直接返回。 - 目标值 >
mid
→ 扔掉左半边 (left = mid + 1
) - 目标值 <
mid
→ 扔掉右半边 (right = mid - 1
)
- 如果
- 重复切分:在剩下的半区继续对半分,即重复以上步骤 , 直到找到目标或范围为空。
图示过程(找数字7):
初始范围: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 目标=7
第1步: mid=5 → 5<7 → 砍左半边 [6,7,8,9,10]
第2步: mid=8 → 8>7 → 砍右半边 [6,7]
第3步: mid=7 → 找到目标!
代码示例:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # 找到目标,返回索引
elif arr[mid] < target:
left = mid + 1 # 砍左半边
else:
right = mid - 1 # 砍右半边
return -1 # 未找到
# 示例
arr = [1, 3, 5, 7, 9]
print(binary_search(arr, 7)) # 输出: 3
三、实际生活案例
案例1:网购筛选
你想买100-200元的运动鞋:
- 按价格排序所有鞋子
- 先看中间价150元的鞋子
- 觉得贵了 → 只看100-150元的
- 再看125元的 → 正好合适!
省去翻看几百件商品的麻烦
案例2:猜价格
商场"猜商品价格"活动(价格0-1000元):
- 你猜500 → 主持人说"高了"
- 猜250 → “低了”
- 猜375 → “中了”
每次砍掉一半错误选项,最快6次必中(2^10=1024>1000)
四、常见应用场景
场景 | 具体例子 | 优势 |
---|---|---|
有序数据查找 | 电话簿找联系人/字典查单词 | 比逐页翻快10倍 |
数值计算 | 求平方根(如√2=1.414…) | 精确到小数点后10位仅需30步 |
故障诊断 | Git二分定位bug/软件版本排查 | 1小时解决需1天的问题 |
日常决策 | 找合适房价/确定旅行预算范围 | 避免盲目尝试 |
游戏开发 | 地形生成/碰撞检测 | 实时处理百万级数据 |
计算机科学 | 在有序数组中快速查找数据 | 10亿数据只需30步就能找到 |
金融投资 | 确定合理股价区间 | 避免盲目猜测,科学决策 |
五、二分法的强大之处
效率对比:
- 暴力搜索:1000个数据最多查1000次
- 二分查找:1000个数据最多查10次(2^10=1024)
- 10亿数据:仅需30次!(2^30≈10亿)
注:数据量越大越高效
生活类比:
- 暴力搜索:像在没分类的衣柜里找一件衣服 → 可能翻遍整个衣柜
- 二分法:像在整理好的衣柜里找衣服 → 先排除所有非目标区域
六、使用前提
- 必须有序:就像图书馆的书要按编号排好
- 可比较大小:数据能判断"大于/小于"关系
不适合场景:
- 未排序的数据(如杂乱的书桌)
- 模糊匹配(如"找长得像明星的人")
- 数据量很小(3-5个元素)
七、动手实践:猜数字游戏
游戏规则:
- 我想一个1-100的数字(比如73)
- 使用二分法猜
- 我会提示"大了"或"小了"
游戏过程:
你猜50(中间值) → 我说"小了"(73>50) → 范围缩小到51-100
你猜75(51-100中间) → 我说"大了"(73<75) → 范围缩小到51-74
你猜62(51-74中间) → 我说"小了"(73>62) → 范围缩小到63-74
你猜68(63-74中间) → 我说"小了"(73>68) → 范围缩小到69-74
你猜71(69-74中间) → 我说"小了"(73>71) → 范围缩小到72-74
你猜73 → 正确!
只需6步就猜中,最多也只需7步!
总结
- 二分法 = 有序数据 + 对半排除
- 核心价值:把大海捞针变成游泳池捞针
- 适用场景:任何需要"快速定位"的场景
- 最大优势:数据量越大,效率优势越惊人!
记住这个口诀:“排好序,取中间,砍一半,重复干”