Python二分查找疑问:索引处理、字符串比较及数组排序影响
关于二分查找的三个疑问解答
1. 代码中len(inventory)-1里的-1有什么作用?
Python列表采用0索引规则,比如5元素数组的合法索引范围是0到4。len(inventory)返回的是数组元素总个数(这里是5),直接用它作为high的初始值会超出数组最大合法索引,后续访问inventory[high]时会触发索引越界错误。减1之后,high的初始值就对应数组最后一个元素的索引(4),确保所有索引访问都是合法的。
2. SearchItem如何判断自身与inventory[Mid]的大小关系?
在Python里,同类型变量可直接用<、>、==这类比较运算符对比:
- 如果是字符串,会按Unicode码点逐字符比较。比如
"a" < "b"结果为True,因为"a"的Unicode码点(97)小于"b"(98);多字符字符串会从第一个字符开始依次对比,直到分出大小。 - 如果是数字,直接对比数值大小即可。
- 不同类型(比如字符串和数字)直接比较会报错,所以二分查找的数组必须是同类型元素组成的。
3. 为何将字符串"a"放在数组不同位置时,查找结果不同(一个找到位置5,一个显示不存在)?
核心原因是二分查找的前提是数组必须有序:
- 若数组无序,二分查找的逻辑完全失效,它只会按中间值对比缩小范围,根本无法定位正确位置,甚至会返回错误索引(比如你提到的位置5,这其实是数组越界的结果——如果初始
high没减1,代码可能会访问不存在的索引5,误判为找到目标)。 - 只有当数组有序(比如按字典序排列的字符串数组),二分查找才能正确定位目标元素。把"a"放在无序数组里,代码大概率找不到;放在有序数组的对应位置,才能返回正确索引。
内容的提问来源于stack exchange,提问作者AHM Mamun
相关产品推荐
相关产品推荐

