1. 线性查找
对于python而言,线性查找就是在一个列表中按顺序依次查找每一个元素,直到找到元素或者列表的最后一个元素为止。
python内置的index()列表查找函数应用的就是线性查找。
示例代码:
# 线性查找
def linear_search(li, val):
for ind, v in enumerate(li):
if v == val:
return ind
else:
return None
算法优点:
实现简单,应用范围广
算法缺点:
查找效率低
2. 二分查找
二分查找的前提是有序列表,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个表,
如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或
直到子表不存在为止,此时查找不成功。
示例代码:
# 二分查找
def binary_search(li, val):
# left 代表列表最左端的索引
# right 代表最右端的索引
# mid 代表列表中间的索引
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
# 查询不到返回None
else:
return None
算法优点:
查找效率高于顺序查找
算法缺点:
必须是有序列表
大O表示法表示各算法和操作所需的时间
算法 | 大O表示法表示的运行时间 |
---|---|
线性查找 | O(N) |
二分查找 | O(logN) |
无序数组的插入 | O(1) |
有序数组的插入 | O(N) |
无序数组的删除 | O(N) |
有序数组的删除 | O(N) |