数据结构与算法基础
什么是查找?
查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程
列表查找(线性表查找):从列表中查找指定元素(输出为元素下标)
内置列表查找函数:index()
index()是线性查找
①顺序查找
顺序查找也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止
代码实现如下:
def linear_search(li,val):
for ind , v in enumerate(li):
if v == val:
return ind
else:
return None
这里你们肯定有疑惑为什么用enumera()呢?
我将介绍它的作用:
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
普通的 for 循环 :
i = 0
seq = ['one', 'two', 'three']
for element in seq:
print i, seq[i]
i += 1
#输出:
0 one
1 two
2 three
for 循环使用 enumerate:
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print i, element
#输出:
0 one
1 two
2 three
②二分查找
二分查找又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。(条件:必须先排序!)
代码实现如下:
def binary_search(li,val):
left = 0
right = len(li) - 1
while left <= right: #候选区有值
mid = (left + right) // 2
if li[mid] == val:
return mid
elif li[mid] >val:
right = mid - 1
else:
left = mid + 1
else:
return None
③顺序查找与二分查找的比较
二分查找的时间复杂度:O(logn)
线性查找的时间复杂度:O(n)
可知二分查找的时间复杂度比顺序查找的时间复杂度小,速度更快!
但是二分查找是有序的,顺序查找则是无序。如果要先排序且时间很久推荐使用顺序查找,要是该数据一直使用的话,推荐使用二分查找