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)