• 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)
  • 相关阅读:
    HTTPS
    数字签名与数字证书
    oracle 10g 数据库与客户端冲突导致实例创建无监听问题
    javascript正则表达式提取子匹配项
    设计模式的分类
    【2020第一篇】环境问题基础知识
    【致 2020】2020
    【python】写demo 的时候,pycharm 编辑器总是提示"method XX may be static"
    sql 练习题 (二)
    【python项目】json 和dict 的区别
  • 原文地址:https://www.cnblogs.com/weihengblog/p/9427070.html
Copyright © 2020-2023  润新知