看起來,鑑於您的代碼,二進制搜索存在概念性問題。如果我們首先解決這個問題,代碼應該更有意義。
什麼是二分查找?
給出一個有序的列表和一個你正在搜索的項目,你將這個列表減半,然後依次查看每一半。我們來看一個例子。鑑於[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