zoukankan      html  css  js  c++  java
  • 算法之查找

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

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

    二、列表查找方式

    • 顺序查找 : 从列表的第一个元素开始遍历,知道找到为止。时间复杂度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))
  • 相关阅读:
    js(四) 全选/全不选和反选
    js(三) ajax异步局部刷新技术底层代码实现
    js(二) 实现省市联动(json)
    接口
    内部类
    封装
    Static关键字
    this关键字
    带参数的方法
    abstract关键字
  • 原文地址:https://www.cnblogs.com/harryblog/p/10637824.html
Copyright © 2011-2022 走看看