回顾线性搜索
描述首次匹配算法。在包含 1,000 个值的列表中查找不存在的目标,可能需要多少次比较?
利用有序数据,在每一步排除一半剩余候选项。
从全部八个值开始。计算中间索引时向下取整,再检查该位置的值。
low = 0mid = —high = 7高亮 = 刚执行的语句。跳过的分支不会高亮。
def binary_search(items, target): low = 0 high = len(items) - 1 while low <= high: mid = (low + high) // 2 if items[mid] == target: return mid elif items[mid] < target: low = mid + 1 else: high = mid - 1 return -1 准备调用 binary_search(items, 42)。
描述首次匹配算法。在包含 1,000 个值的列表中查找不存在的目标,可能需要多少次比较?
手工在 [3, 8, 12, 17, 23, 31, 42, 56] 中搜索 31。使用从零开始的索引、low = 0、high = len(items) - 1 和 mid = (low + high) // 2。比较未匹配后,解释可以舍弃哪一半。
建立表格,包含迭代次数、low、high、mid、items[mid] 与下一步操作。跟踪成功查找 31 和失败查找 20 的过程。记录每种情况循环终止的原因。
编写 binary_search(items, target),返回匹配索引或 -1。在 low <= high 时继续。测试空列表、单元素列表、首尾值及不存在的值。比较预期与实际结果。
解释为什么下一边界是 mid + 1 或 mid - 1,而不是 mid。说明有重复值时能保证什么。
是什么使搜索区间不断缩小?为什么无序输入会破坏这一推理?
完成算法讲义第 1、2 题,再阅读教材的二分搜索部分。请在 9 月 21 日星期一前准备好作业。