顺序查找以及二分查找
今天简单介绍一下两个查找方法。
先说说什么是查找:
查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。
列表查找
列表查找(线性表查找): 从列表中查找指定元素
输入: 列表、待查找元素
输出: 元素下标(未找到元素时一般返回None
或-1
)
Python的内置列表查找函数: index()
顺序查找
顺序查找: 也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。
code:
'''
TOP: 顺序查找
author: Blue
time: 2020-07-21
e-mail: 2458682080@qq.com
'''
def linear_search(li, val):
for index, value in enumerate(li):
if value == val :
return index
else :
return None
test:
li = [2, 5, 6, 9, 3, 10]
# 用顺序排序
inde = linear_search(li, 10)
print(inde)
# 用Python内置index函数
print(li.index(10))
result:
5
5
搜索了整个列表,故时间复杂度为: O(n)
二分查找(Binary Search)
二分查找: 又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半
'''
TOP: 二分查找
author: Blue
time: 2020-07-22
e-mail: 2458682080@qq.com
'''
def binary_search(li, val):
left = 0
right = len(li) - 1
while left <= right : # 候选区有值
mid = (left + right) // 2 # 整除2
if li[mid] == val:
return mid
elif li[mid] > val: # 待查找的值在Mid左侧
right = mid - 1
else: # 待查找的值在Mid右侧
left = mid + 1
else:
return None
x = binary_search([1,2,3,4,5,6,7,8,9], 3)
print(x)
result:
2
特别要注意:二分查找的前提条件是列表为有序列表
二分查找的时间复杂度: O(log(n))