Python查找算法之 -- 列表查找和二分查找


一、列表查找:從列表中查找指定元素

  • 輸入:列表、待查找元素
  • 輸出:元素下標或未查找到元素

二、列表查找方式

  • 順序查找 : 從列表的第一個元素開始遍歷,知道找到為止。時間復雜度O(n)
  • 二分查找 :從有序的列表的候選區L[0:n]開始,通過堆待查找的值與候選區中間值進行比較,每次候選區數減少一半,時間復雜度O(logn)

順序查找

def linear_search(data_set, value):
    for i in range(range(data_set)):
        if data_set[i] == value:
            return i
    return

三、二分查找

不使用遞歸的方式:

def binary_search(l,n):
    low = 0
    hight = len(l)
    while low <= hight:
        mid = (low + hight) // 2
        if l[mid][id] < n:
            print(l[mid])
            low = mid + 1
        elif l[mid][id] > n:
            print(l[mid])
            hight = mid - 1
        else:
            return mid

使用遞歸的方式:

def binary_search(l,aim,start= 0,end=None):
    if end == None:end = len(l) - 1
    if start <= end:

        # (end - start) // 2 + start    兩種方法
        mid = (end + start) // 2  #12 18
        if l[mid] < aim:
            return func(l,aim,start = mid + 1,end = end) # [42,43,55,56,66,67,69,72,76,82,83,88]
        elif l[mid] > aim:
            return func(l,aim,start = start,end = mid - 1)
        elif l[mid] == aim:
            return mid
    else:
        return None

要求列表是有序的,所以python中列表的查找,並不是采用的二分查找。

四、練習

LetCode網站題目:

現有一個學員信息列表(按id增序排列),格式為:
stu_info = [
    {id:1001, "name":"張三", "age":20},
    {id:1002, "name":"李四", "age":25},
    {id:1004, "name":"王五", "age":23},
    {id:1007, "name":"趙六", "age":33}
]
修改二分查找代碼,輸入學生id,輸出該學生在列表中的下標,並輸出完整學生信息。
def binary_search(l,n):
    low = 0
    hight = len(l)
    while low <= hight:
        mid = (low + hight) // 2
        if l[mid][id] < n:
            print(l[mid])
            low = mid + 1
        elif l[mid][id] > n:
            print(l[mid])
            hight = mid - 1
        else:
            return mid

ret = binary_search(stu_info,1004)
print(ret)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM