---用教授的方式学习。
目录
10.1 搜索算法
本节会研究两种搜索列表的算法,每种方法都满足以下规范:
def search(L, e):
"""假设L是列表
如果e是L中的元素,则返回True,否则返回False"""
10.1.1 线性搜索与间接引用元素
Python使用以下算法确定列表中是否有某个元素:
for i in range(len(L)):
if L[i] == e:
return True
return False
10.1.2 二分查找和利用假设
有序列表的线性搜索
def search(L, e):
"""假设L是列表,其中元素按升序排列。
ascending order.
如果e是L中的元素,则返回True,否则返回False"""
for i in range(len(L)):
if L[i] == e:
return True
if L[i] > e:
return False
return False
这种算法可以缩短平均运行时间,但不会改变最差情形下的算法复杂度,因为在最差情形下还是需要检查L中的每个元素。
二分查找的思路非常简单:
(1) 选择一个可以将列表L大致一分为二的索引i;
(2) 检查是否有L[i] == e;
(3) 如果不是,检查L[i]大于还是小于e;
(4) 根据上一步的结果,确定在L的左半部分还是右半部分搜索e。
给定算法结构之后,很显然,实现二分查找的最简单直接的方式就是使用递归,如下所示。
递归二分查找
def search(L, e):
"""假设L是列表,其中元素按升序排列。
ascending order.
如果e是L中的元素,则返回True,否则返回False"""
def bSearch(L, e, low,