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)

 

posted @ 2018-08-05 20:39  短毛兔  阅读(4355)  评论(2编辑  收藏  举报