列表查找以及二分查找

Posted weihengblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表查找以及二分查找相关的知识,希望对你有一定的参考价值。

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

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

二、列表查找方式

  • 顺序查找 : 从列表的第一个元素开始遍历,知道找到为止。时间复杂度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)

 

以上是关于列表查找以及二分查找的主要内容,如果未能解决你的问题,请参考以下文章

算法----列表查找以及列表排序

列表查找及二分查找

列表查找及二分查找

二分查找

算法——二分查找

python算法:二分查找