看起来,鉴于您的代码,二进制搜索存在概念性问题。如果我们首先解决这个问题,代码应该更有意义。
什么是二分查找?
给出一个有序的列表和一个你正在搜索的项目,你将这个列表减半,然后依次查看每一半。我们来看一个例子。鉴于[1, 2, 3, 4, 5, 6]
和搜索5
你看看列表[1,2,3]
和[4,5,6]
列表的两半。查看前半部分([1,2,3]
),您注意到最大的项目是3
。鉴于列表已订购,列表中的所有项目必须小于3
。这意味着5
(您正在搜索的内容)不可能位于较小的列表中。你现在看([4,5,6]
)。让我们把它分成两个列表[4]
和[5,6]
,依此类推。
我申请二进制搜索我的问题
鉴于号码列表和搜索词怎么做的,你需要的是仍比搜索词更小的列表返回最大的项目。
将列表拆分为两半(尽可能相等,因为奇数大小的列表总是不均匀的)。看看第二个半列表中最小的项目。如果最小项大于搜索项,那么您知道您要查找的值位于前半列。否则,它在下半部分。继续分解清单,直到你找到你需要的东西。
是什么代码看起来象
def largest_item_less_than_x(x, list_of_vals):
size = len(list_of_vals)
if (size == 0):
return None
if (size == 1):
if (list_of_vals[1] < x):
return list_of_vals[1]
else:
return None
else:
mid = size // 2
left_half_list = list_of_vals[0:mid]
right_half_list = list_of_vals[mid:]
if (right_half_list[0] < x):
return largest_item_less_than_x(x, right_half_list)
else:
return largest_item_less_than_x(x, left_half_list)
让遍历代码。如果你给它一个空列表,它将返回None。也就是说,如果没有可供选择的元素,则搜索项目不会返回任何内容。
如果您给它一个值大于您要搜索的值的单个列表,它将返回None,即给出[6]
并搜索3
,那么您将无法找到您要查找的内容。
如果您给它一个值小于您要搜索的值的单个列表,它会返回该值。
如果您给它一个以上的项目列表,然后它将列表分成两半,并递归搜索每一半。
希望有道理。
@BradSolomon我怀疑他会被允许这么做 - OP明确指出了二进制搜索算法。另外,代码的缩进实际上是关闭的。 – Jerrybibo
我认为你必须稍微修改一下算法。 higherval将始终为y,因为numblist是有序的,y之后没有小于y的元素。所以higherval = y总是工作。而lowerval和lowerval都是索引,而不是列表中的元素。根本不需要进行二分搜索,因为列表是有序的,所以最高的数字总是会在y之前出现。因此,如果y的索引不是0,那么输出始终是numblist [numblist.index(y)-1],在这种情况下,答案只有y。 – pvkcse