1二分查找算法
二分查找是一種算法,其輸入是一個有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否則返回null。
下面的實例說明了二分查找的工作原理。我隨便想一個1~100的數字,目標是你以最小的次數猜到這個數字。你每次猜測後,我會說小了、大了或對了。
1 | 2 | 3 | ... | 100 |
假設你從你開始一次往上猜測,過程會是這樣的。
這是簡單查找,更準確的說法是傻找。每次猜測都只能排除一個數字。如果我的數字是99,你得猜99次才能猜到。
最佳的查找方式,從50開始。
小了,但排除了一半的數字!你知道1~50都小了。接下來,你猜75.
大了,,那餘下的數字又排除了一半!使用二分法查找時,你猜測的是中間的數字,從而每次都將餘下的數字排除一半。接下來,你猜63(50-75中間的數字)。
這就是二分法查找。每次猜測排除的數字個數如下。不管我心裏想的那個數字,你在7次之內都能猜到,因爲每次猜測都將排除很多數字!
假設你要在字典中查找一個單詞,而該字典包含240000和單詞,你認爲每種查找最多需求多少步?
如果要查找的單詞位於字典末尾,使用簡單查找將需要240000步。使用二分查找時,每次排除一半單詞,直到最後剩下一個單詞。一般而言,對於包含n個元素的列表,用二分法查找最多需步,而簡單查找最多需要n步。僅當列表有序的時候二分法才管用。
2 Python代碼
def binary_search(orderly_list, number): print(orderly_list) if len(orderly_list) == 0: print('not exist') # 每次查找後的剩餘部分 return mid_index = len(orderly_list) // 2 # 向下取整 if number > orderly_list[mid_index]: # 要查找的數字小於列表中間值 binary_search(orderly_list[mid_index + 1:], number) # 列表折半繼續往右找 elif number < orderly_list[mid_index]: # 要查找的數字大於列表中間 binary_search(orderly_list[0:mid_index], number) # 列表折半繼續往左找 else: print('find exist') # print(orderly_list.index(number)) number_list = [1, 3, 5, 7, 9, 11, 12, 15, 16] # 定義一個列表 binary_search(number_list, N)