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

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

二、列表查找方式

  • 顺序查找 : 从列表的第一个元素开始遍历,知道找到为止。时间复杂度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(li, val):
    '''
    传入一个列表先取出中间值, 如果val大于中间值则向右查找否则向左查找
    '''
    low = 0
    high = len(li) - 1
    while low <= high:  # 候选区有值
        mid = (low + high) // 2  # 取中间值
        if li[mid] > val:
            high = mid - 1
        elif li[mid] < val:
            low = mid + 1
        else:
            return mid
    else
        return None

使用递归的方式实现

def recurse_search(li, val, low, high):
    if low <= high:
        mid = (low + high) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val:
            return recurse_search(li, val, low, mid - 1)
        else:
            return recurse_search(li, val, mid + 1, high)

 四、查找练习

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_search2(li, val):
    '''
    传入一个列表先取出中间值, 如果val大于中间值则向右查找否则向左查找
    '''
    low = 0
    high = len(li) - 1

    while low <= high:
        mid = (low + high) // 2
        if li[mid]['id'] > val:
            high = mid - 1
        elif li[mid]['id'] < val:
            low = mid + 1
        else:
            return mid, li[mid]
    else:
        return '没找到学生'

print(binary_search2(stu_info, 1003))

 

posted on 2019-04-01 17:43  cs_1993  阅读(177)  评论(0编辑  收藏  举报