一、查找(搜索)
现在我们将会把我们的注意力放在搜索和排序上,它们是计算中所出现的最常见的问题。在本节中,我们将学习搜索。搜索的算法过程就是在一些项的集合中找到一个特定的项。搜索过程通常会根据特定项是否存在来给出回答True
或者False
。有时它可能会返回特定项所出现的位置。我们在此的目的,就只是关心集合成分的问题。 在Python中,有一个非常简单的方法来判别特定项是否在列表中。我们使用in
这个运算符,如下:
>>> 15 in [3,5,2,4,1]
False
>>> 3 in [3,5,2,4,1]
True
>>>
尽管我们可以很容易写出这个代码,但为了回答这个问题必须执行一个潜在的程序。事实证明,有很多不同的方法来寻找一个特定项。我们感兴趣的是这些算法的工作原理以及它们互相比较时的优劣之分。
1、顺序查找
1.1 无序表查找的代码:
算法分析
1.2 有序表查找的代码
算法分析
2、二分查找
2.1 二分查找非递归的代码
def binarySearch(alist, item):
"""
二分查找:非递归实现
"""
first = 0
last = len(alist) - 1
found = False
while first < last and not found:
midpoint = (first + last) // 2
if alist[midpoint] == item:
found = True
else:
if alist[midpoint] > item:
last = midpoint - 1
else:
first = midpoint + 1
return found
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binarySearch(testlist, 3)) # False
print(binarySearch(testlist, 13)) # True
2.2 递归算法实现二分查找的代码
def binarySearch(alist, item):
"""
二分查找:递归实现
"""
if len(alist) == 0: # 边界条件
return False
else:
midpoint = len(alist)//2
if alist[midpoint] == item:
return True
elif alist[midpoint] < item:
return binarySearch(alist[midpoint+1:], item) # 一定要记得减小规模
else:
return binarySearch(alist[:midpoint], item) # 减小规模
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binarySearch(testlist, 3)) # False
print(binarySearch(testlist, 13)) # True
算法分析
3、散列函数hashing
散列函数的 查找算法 的时间复杂度为O(1)。
具体的原理和实现过程太多,新写了一个博客