Python数据结构之搜索讲解
在针对某一个问题需要查找特定数据时,搜索算法就显得非常有用。在Python中有多种搜索算法可以使用。本文将会讲解常见的三种搜索算法:线性搜索、二分搜索和深度优先搜索。
线性搜索
线性搜索是最简单的搜索算法,也是最容易实现的一种。如其名,线性搜索是对列表或数组里的每一个元素进行逐一比较。如果找到匹配元素,算法就会返回其索引。否则,算法返回 -1
或一个其他的标识符表示未找到相应的元素。
def linear_search(array, target):
for i in range(len(array)):
if array[i] == target:
return i
return -1
下面是一个例子,这个例子演示了如何使用线性搜索算法查找列表中的某个元素:
my_list = [4, 2, 9, 25, 16, 1, 12]
print(linear_search(my_list, 9)) # 2
print(linear_search(my_list, 14)) # -1
在第一个例子中,linear_search
函数在元素 9
中找到了它,并返回其索引 2。在第二个例子中,函数返回 -1
表示并未找到元素 14
。
二分搜索
二分搜索算法是一种更加高效的搜索算法。当你需要查找的列表或数组是有序时,二分搜索可以在很短的时间内找到所需的元素。
基本思路是通过与中间元素的比较来确定下一个要搜索的子数组(左侧或右侧)。通过这一过程,算法逐渐缩小搜索范围,直到找到匹配元素为止,或者发现了列表并不包含该元素。
def binary_search(array, target):
left = 0
right = len(array) - 1
while left <= right:
mid = (left + right) // 2
if array[mid] == target:
return mid
elif array[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
下面是一个例子,这个例子演示了如何使用二分搜索算法查找有序列表中的某个元素:
my_list = [1, 3, 6, 9, 12, 17, 21, 22, 23]
print(binary_search(my_list, 6)) # 2
print(binary_search(my_list, 23)) # 8
print(binary_search(my_list, 20)) # -1
在第一个例子中,binary_search
函数在元素 6
中找到了它,并返回其索引 2。在第二个例子中,函数在元素 23
中找到了它,并返回其索引 8。在第三个例子中,函数返回 -1
表示并未找到元素 20
。
深度优先搜索
深度优先搜索算法是一种在树或图数据结构中查找元素的搜索算法。它从某一定点开始,尽可能“往下”搜索,直到无法再往下为止。然后回溯,并继续从另一个相邻节点开始“往下”搜索。
深度优先搜索可以用迭代和递归两种方式来实现。下面是使用递归实现的深度优先搜索的例子:
graph = {
'A': set(['B', 'C']),
'B': set(['A', 'D', 'E']),
'C': set(['A', 'F']),
'D': set(['B']),
'E': set(['B', 'F']),
'F': set(['C', 'E'])
}
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for next_node in graph[start] - visited:
dfs(graph, next_node, visited)
return visited
下面是一个演示如何使用深度优先搜索算法遍历图结构的例子:
print(dfs(graph, 'A')) # {'E', 'D', 'F', 'A', 'C', 'B'}
在这个例子中,我们从节点 A
开始遍历图结构,并返回一个包含已访问节点的集合。
结论
在Python中,有很多种搜索算法可以使用,每种算法都有其适用的特定场景。总的来说,线性搜索适用于小数据量的列表或数组;二分搜索适用于有序的较大数据量的数组或列表;深度优先搜索适用于树或图数据结构的遍历。当你需要编写搜索算法时,请考虑使用以上任意一种算法。