二分查找算法部分场景失效问题排查:复制《算法图解》代码后查找特定元素失败的原因分析
问题分析:二分查找无法找到目标元素的原因
你遇到的问题主要出在两个关键逻辑错误上,咱们拆解来看:
1. 中间索引计算的类型不规范
在Python 3中,(low + high)/2会返回浮点数,而列表的索引必须是整数。虽然少数场景下Python可能会隐式转换,但这是不严谨的写法,甚至会在low+high为奇数时直接抛出TypeError(比如得到49.5这种非整数索引)。正确的做法是用整数除法//,确保得到的是整数索引:
mid = (low + high) // 2
2. 搜索范围调整的逻辑错误
这是导致你找不到数字1的核心原因:当猜测的元素guess大于目标item时,说明目标肯定在mid的左侧区间,此时应该把high设置为mid - 1,而不是mid + 1。你的代码里写的high = mid + 1会直接把搜索范围跳到mid右侧,完全漏掉了左侧的元素,自然找不到位于列表最左端的1。
修正后的完整代码
def binary_search(list, item): low = 0 high = len(list) - 1 while low <= high: mid = (low + high) // 2 # 改用整数除法保证索引为整数 guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 # 调整为mid-1,缩小到左半区间 else: low = mid + 1 return None list1 = [] for i in range(1, 101): list1.append(i) print(list1) print(binary_search(list1, 1)) # 现在会正确返回索引0
验证逻辑
当查找1时,修正后的代码会逐步缩小范围:
- 初始
low=0,high=99,mid=49,guess=50>1,所以high=48 - 接下来
low=0,high=48,mid=24,guess=25>1,high=23 - 重复这个过程,最终会定位到
mid=0,guess=1,返回正确的索引0。
内容的提问来源于stack exchange,提问作者ela rednax
相关产品推荐
相关产品推荐

