二分查找最坏情况下的比较次数计算疑问
二分查找最坏情况下的相等比较次数(针对123456个元素)
结论
你指定统计A[i] = E这类相等比较的话,123456个元素的数组,二分查找最坏情况下的相等比较次数是17次。
为啥不同资料结果差这么多?
不同公式的差异根源是对“比较次数”的定义完全不同,还有部分是计算失误:
- 说
log₂(n+1)得到25次的:纯计算错误。log₂(123456+1)≈16.91,向上取整是17,根本到不了25,大概率是混淆了对数底数(比如误用以10为底的对数后乱换算)。 - 用
2logn+1或2logn-1得到50次的:这类公式统计的是所有比较操作(包括判断大小的A[i] < E/A[i] > E,再加相等比较),而且就算按这个定义,计算结果也不对——按123456算,所有比较次数撑死34次,50次明显是公式套用错误或者底数搞混了,完全不符合你要的“只统计相等判断”的要求。
正确的计算逻辑
只算A[i] = E的话,本质就是算二分查找的循环迭代次数——因为每次进循环都会做一次相等判断:
- 最坏情况是目标元素不存在,或者要到最后一个可能的位置才找到目标,这时候循环会执行到搜索区间为空才停。
- 循环次数k满足:
2^(k-1) < n ≤ 2^k,n是数组元素数。- 代入123456:
2^16=65536,2^17=131072,显然65536 < 123456 ≤ 131072,所以k=17。
- 代入123456:
- 也就是说,最坏情况下会执行17次相等比较。
额外说明:不同比较定义的区别
如果要统计所有比较操作(相等+大小判断),最坏情况次数大概是34次(每次循环先做相等判断,不等再做一次大小判断,17次循环就是17*2=34),但这和你问题里的要求无关。
内容的提问来源于stack exchange,提问作者BlackPearl
相关产品推荐
相关产品推荐

