Java二分查找无法正确统计搜索次数及返回索引值问题求助
搞定你的二分查找返回-1问题
嘿,我来帮你排查下这个头疼的问题——明明目标数字应该在1-131073的数组里,结果二分查找却一直返回代表“不存在”的-1。结合你的描述,我整理了几个最容易踩的坑和对应的解决办法:
1. 数组读取出问题了!
从文本文件读数组的时候,很容易因为格式不匹配搞砸:
- 先检查你的文本文件是不是每行一个数字?或者有没有用逗号/空格分隔?如果你的读取逻辑和文件格式对不上,数组里可能会有缺失元素、乱序,甚至读出来的是字符串(比如
"123"而不是整数123)。 - 一定要验证读取后的数组:长度是不是刚好131073?元素是不是从1到131073严格递增?二分查找的核心前提是数组必须有序,乱序的话查找肯定失效。
2. 二分查找的边界条件写错了
这是二分查找最常见的bug,比如:
- 初始的
high设成了len(arr)而不是len(arr)-1(数组索引从0开始啊!),这会导致最后一次查找越界,直接错过目标值。 - 循环终止条件用了
low < high而不是low <= high,会漏掉最后一次可能匹配的情况。 - 更新
low或high的时候出错:比如目标值比arr[mid]大,应该把low = mid + 1,而不是low = mid,不然会陷入死循环或者缩错区间。
给你一个正确的二分查找示例(带搜索次数统计),你可以对比自己的代码:
class BinarySearch: def __init__(self, arr): self.arr = arr def find_number(self, target): low = 0 high = len(self.arr) - 1 search_times = 0 while low <= high: search_times += 1 mid = (low + high) // 2 if self.arr[mid] == target: print(f"搜索次数:{search_times}") return mid elif self.arr[mid] < target: low = mid + 1 else: high = mid - 1 print(f"搜索次数:{search_times}") return -1
3. 目标值和数组元素类型不匹配
比如你从文件里读出来的是字符串类型的数字,而你要查找的是整数,这时候==判断会直接返回False,自然找不到。解决办法是读取的时候把每个元素转成整数:
# 举个读取文件的正确例子 with open("your_numbers_file.txt", "r") as f: # 跳过空行,把每行转成整数 num_array = [int(line.strip()) for line in f if line.strip()]
4. 最后再确认下:目标值真的在数组里吗?
虽然你说文件是1-131073,但还是要检查下:你要找的数字是不是在1到131073之间?有没有可能输入的时候打错了(比如多打了个0)?可以先用target in num_array快速验证一下(虽然这会遍历数组,但能快速确认问题出在查找逻辑还是数组本身)。
内容的提问来源于stack exchange,提问作者Bryan Delgado
相关产品推荐
相关产品推荐

