二分查找(Binary Search)查找'TARYN'的正确方法与步骤确认
先给你理清楚核心前提:二分查找能生效的关键是列表必须是有序的——不过先看你给的这个列表,里面REUBEN在TARYN后面但字母顺序R比T靠前,明显是乱序的,这个先记下来,后面会说到。
咱们先把列表的索引和对应元素列出来,方便一步步分析:
- 索引0: ANNE
- 索引1: BEN
- 索引2: CLIVE
- 索引3: DAVE
- 索引4: ETHAN
- 索引5: GAL
- 索引6: STEVE
- 索引7: TARYN
- 索引8: REUBEN
- 索引9: YVONNE
先看方法1的逻辑
你提到方法1阶段1是MP=(0+9)/2=4.5=4,也就是用向下取整的方式取中点mid=4,对应元素是ETHAN。接下来按常规二分查找,会比较'TARYN'和ETHAN的字母顺序——TARYN更大,所以会舍弃左半部分(索引0-4),去右半部分(索引5-9)继续找。
但这里有个大问题:你的列表是乱序的!REUBEN在索引8,字母顺序比TARYN小,但位置却在TARYN后面,这时候按字母顺序判断的话,后续查找会出错;如果只是按列表的位置“前后”来判断(不管字母),那二分查找的意义就没了,因为根本没利用有序性,纯靠碰运气。
再聊你倾向的方法2
虽然你没写出方法2的完整步骤,但大概率是用了向上取整的中点计算,比如MP=(0+9+1)/2=5,直接取mid=5,对应元素是GAL。同样比较字母顺序,TARYN更大,所以去右半部分(索引6-9),这时候再算中点(6+9)/2=7.5,向下取整就是7,正好命中TARYN——这也是你倾向它的原因吧?
到底哪种更合适?
得分两种情况说:
情况1:列表是严格按字母升序排列的(你的列表是写错了)
如果把列表改成正确的有序状态:ANNE、BEN、CLIVE、DAVE、ETHAN、GAL、REUBEN、STEVE、TARYN、YVONNE——这时候两种方法都是合法的二分查找实现,没有对错之分,只是不同的实现细节:
- 向下取整是最常见的写法,比如很多语言里用
(low + high) // 2; - 向上取整一般是为了避免边界死循环(比如当low和high相邻时,向下取整可能一直停在low,导致无法推进)。
两者最终都能找到目标,只是步骤多少的区别,不存在“更合适”,看你要处理的边界场景。
情况2:就按你现在给的乱序列表
这时候两种方法都不靠谱!因为二分查找的核心是利用有序性快速缩小范围,列表乱序的话,每次取中点后根本没法确定目标在左半部分还是右半部分,这次方法2能找到只是巧合,换个目标比如REUBEN,用二分查找大概率找不到。这种情况要么先把列表排序,要么直接用线性查找(一个个遍历)。
总结一下:如果是有序列表,两种方法都是有效的实现;如果是乱序列表,二分查找本身就不适用,别纠结哪种方法了。
内容的提问来源于stack exchange,提问作者Compoot

