1. 程式人生 > 其它 >演算法圖解: 1.二分查詢

演算法圖解: 1.二分查詢

""" 
@project: books
@file: binary_search.py 
@time: 2021/08/11
@software: PyCharm
@author: zy7y
二分查詢演算法:
二分查詢是一種演算法,其輸入是一個有序的元素列表(必須有序的原因稍後解釋)。如果要
查詢的元素包含在列表中,二分查詢返回其位置;否則返回null

猜大小遊戲
給定 1 ~ 100 中的某個數字 55
非二分查詢: 從 1 依次 向上猜到 55 共計猜55次
二分查詢:從50開始猜, 次數就會少很多(每次猜中間的數字),共計 7次
50 -> 小了
75 -> 大了
63 -> 大了
56 -> 大了
53 -> 小了
54 -> 小了
55 -> 對了

對於包含n個元素的列表,用二分查詢最多需要log2n步,而簡單查詢最多需要n步。
即 8個元素的列表, 使用二分查詢需要 log2 8 = 3


對數:
log10100相當於問“將多少個10相乘的結果為100”。答案是兩個: 10 × 10 = 100。因此, log10100 = 2。

時間(大O): O(logn)

二分查詢的速度比簡單查詢快得多。
 O(log n)比O(n)快。需要搜尋的元素越多,前者比後者就快得越多。
 演算法執行時間並不以秒為單位。
 演算法執行時間是從其增速的角度度量的。
 演算法執行時間用大O表示法表示。
"""
from typing import List, Union


def binary_search(arr: List[int], item) -> Union[int, None]:
    """
    二分查詢,傳入一個有序序列,和序列中某個元素值,快速找到其下標
    :param arr: 有序列表
    :param item: 查詢元素值
    :return: 找到返回下標,找不到返回None
    """
    low = 0    # 起點
    high = len(arr) - 1  # 終點
    while low <= high:  # 起點小於終點 迴圈
        mid = (low + high) // 2  # 中間值
        guess = arr[mid]   # 取到中間值(下標)對應的value
        if guess == item:
            return mid      # 相等 return 下標
        if guess > item:
            high = mid - 1  # 值大,把終點調整為 中間值 - 1
        else:
            low = mid + 1   # 值小, 把起點調整為 中間值 + 1
    return None

my_list = [i
           for i in range(1000)
           if i % 2 == 1
           ]
print(binary_search(my_list, 55555555)) # => 1
作者:zy7y 出處:http://www.cnblogs.com/zy7y 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。