二分查找
二分查找也是一種在數組中查找數據的算法。和線性查找不同,它只能查找已經排好序的數據。二分查找通過比較數組中間的數據與目標數據的大小,可以得知目標數據是在數組的左邊還是右邊。因此,比較一次就可以把查找范圍縮小一半。重復執行該操作就可以找到目標數據,或得出目標數據不存在的結論。
步驟:
01還是來試試查找數字6
02?首先找到數組中間的數字,此處為5。
03??將5和要查找的數字6進行比較。
04?把不需要的數字移出查找范圍。
05??在剩下的數組中找到中間的數字,此處為7。
06?比較7和6。
07?把不需要的數字移出查找范圍。
08?在剩下的數組中找到中間的數字,此處為6。
解說
二分查找利用已排好序的數組,每一次查找都可以將查找范圍減半。查找范圍內只剩一個數據時查找結束。
數據量為n的數組,將其長度減半log2n次后,其中便只剩一個數據了。也就是說,在二分查找中重復執行“將目標數據和數組中間的數據進行比較后將查找范圍減半”的操作log2n次后,就能找到目標數據(若沒找到則可以得出數據不存在的結論),因此它的時間復雜度為O(logn)。
補充說明
二分查找的時間復雜度為O(logn),與線性查找的O(n)相比速度上得到了指數倍提高(x=log2n,則n=2x)。
但是,二分查找必須建立在數據已經排好序的基礎上才能使用,因此添加數據時必須加到合適的位置,這就需要額外耗費維護數組的時間。
而使用線性查找時,數組中的數據可以是無序的,因此添加數據時也無須顧慮位置,直接把它加在末尾即可,不需要耗費時間。
綜上,具體使用哪種查找方法,可以根據查找和添加兩個操作哪個更為頻繁來決定。4
代碼演示:
def binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return mid # 如果找到目標元素,返回元素的索引elif arr[mid] < target:left = mid + 1else:right = mid - 1return -1 # 如果數組中不存在目標元素,返回 -1# 測試二分查找算法
arr = [1, 2, 3, 6, 8, 9]
target = 8result = binary_search(arr, target)if result != -1:print(f"目標元素 {target} 在數組中的索引為 {result}")
else:print(f"目標元素 {target} 不存在于數組中")
結果:
目標元素 6 在數組中的索引為 5