能否对无序列表执行Binary Search?若可行,请提供实现代码示例
无序列表能否执行二分查找?
直接对无序列表执行二分查找不可行。二分查找的核心逻辑依赖于列表的有序性:每次通过中间元素与目标值的大小比较,能确定目标值必然存在于左半区或右半区,从而快速缩小查找范围。无序列表不具备这种特性,强行执行会导致查找结果完全不可靠。
如果要基于二分查找的思路处理无序列表,必须先对列表进行排序,但排序会改变原列表的元素顺序——若仅需判断目标值是否存在,可直接排序后查找;若需要获取目标值在原列表中的索引,则需在排序时保留原索引信息。
实现代码示例
仅判断目标值是否存在(不保留原索引)
def binary_search_unsorted(arr, target): # 先对无序列表排序 sorted_arr = sorted(arr) left, right = 0, len(sorted_arr) - 1 while left <= right: mid = (left + right) // 2 if sorted_arr[mid] == target: return True # 找到目标值 elif sorted_arr[mid] < target: left = mid + 1 else: right = mid - 1 return False # 未找到目标值
获取目标值在原列表中的索引
def binary_search_unsorted_with_index(arr, target): # 排序时保留元素的原索引 sorted_items = sorted((val, idx) for idx, val in enumerate(arr)) left, right = 0, len(sorted_items) - 1 while left <= right: mid = (left + right) // 2 mid_val, mid_idx = sorted_items[mid] if mid_val == target: # 若有重复元素,此处仅返回第一个匹配的原索引,需全部索引可扩展逻辑 return mid_idx elif mid_val < target: left = mid + 1 else: right = mid - 1 return -1 # 未找到目标值
内容的提问来源于stack exchange,提问作者Victor-L-S
相关产品推荐
相关产品推荐

